You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Qt 6在Windows系统读取ISO-8859-15编码的XML?

Qt 6下Windows平台ISO-8859-15编码XML解析错误问题

测试代码

#include <QCoreApplication>
#include <QFile>
#include <QXmlStreamReader>

auto main(int argc, char * argv[]) -> int {
    auto Application = QCoreApplication{argc, argv};
    auto File = QFile{"iso-8859-15.xml"};
    File.open(QIODeviceBase::OpenModeFlag::ReadOnly);
    
    auto StreamReader = QXmlStreamReader{File.readAll()};
    while(StreamReader.atEnd() == false) {
        StreamReader.readNext();
    }
    if(StreamReader.hasError() == true) {
        qDebug() << StreamReader.errorString();
    }
    
    return 0;
}

问题现象

给定包含<?xml version="1.0" encoding="ISO-8859-15" standalone="yes"?>处理指令的合法XML文件iso-8859-15.xml:

  • Linux平台运行程序无错误;
  • Windows平台运行时抛出错误:

"Encoding ISO-8859-15 is unsupported"

疑问

  1. 错误原因是什么?
  2. 是否需要安装或部署额外Qt库?
  3. 该编码在Windows上是否完全不支持,或有可行的解决办法?

注:问题基于Qt 6,QTextCodec仅可通过Core5Compat模块获取,QXmlStreamReader不使用QTextCodec,而是依赖QStringDecoder。


原因分析

Qt 6的QStringDecoder依赖平台原生编码支持:

  • Linux系统通过GLIBC/iconv提供了ISO-8859-15的完整编码映射,所以解析正常;
  • Windows原生编码库(如MultiByteToWideChar)未内置ISO-8859-15的支持,导致QStringDecoder无法识别该编码,触发解析错误。

是否需要额外Qt库?

不需要。Core5Compat模块的QTextCodec对这个问题无效,因为Qt 6的QXmlStreamReader已完全切换到QStringDecoder实现,不再依赖QTextCodec。

解决办法

1. 手动转换编码(轻量方案)

ISO-8859-15是ISO-8859-1的超集,仅少数字符存在差异(如欧元符号€)。可以先以Latin1编码读取内容,再手动替换差异字符:

#include <QCoreApplication>
#include <QFile>
#include <QXmlStreamReader>

auto main(int argc, char * argv[]) -> int {
    auto Application = QCoreApplication{argc, argv};
    auto File = QFile{"iso-8859-15.xml"};
    if (!File.open(QIODevice::ReadOnly)) {
        return 1;
    }
    
    QByteArray rawData = File.readAll();
    QString content = QString::fromLatin1(rawData);
    // 替换ISO-8859-15与ISO-8859-1的差异字符
    content.replace(QChar(0xA4), QChar(0x20AC)); // €
    content.replace(QChar(0xA6), QChar(0x0160)); // Š
    content.replace(QChar(0xA8), QChar(0x017D)); // Ž
    content.replace(QChar(0xB4), QChar(0x0161)); // š
    content.replace(QChar(0xB8), QChar(0x017E)); // ž
    content.replace(QChar(0xBC), QChar(0x0152)); // Œ
    content.replace(QChar(0xBD), QChar(0x0153)); // œ
    content.replace(QChar(0xBE), QChar(0x0178)); // Ÿ

    auto StreamReader = QXmlStreamReader{content};
    while (!StreamReader.atEnd()) {
        StreamReader.readNext();
    }
    if (StreamReader.hasError()) {
        qDebug() << StreamReader.errorString();
    }
    
    return 0;
}

2. 引入第三方编码库(完整兼容方案)

在Windows平台集成libiconv库,通过它将ISO-8859-15字节流转换为UTF-8后再传入QXmlStreamReader,能完整支持所有ISO-8859-15字符,适合严格兼容的场景。

3. 修改XML文件编码(最优简便方案)

如果可修改源文件,直接将XML的编码声明改为UTF-8,并将文件内容转存为UTF-8编码,跨平台解析无任何问题,是最省心的解决方式。


内容的提问来源于stack exchange,提问作者punytroll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 16:14:55