C++ Qt 5编码问题(UTF-8、Windows-1250、Windows-1251)

C++ Qt 5编码问题(UTF-8、Windows-1250、Windows-1251),c++,utf-8,character-encoding,qt5,qt4.8,C++,Utf 8,Character Encoding,Qt5,Qt4.8,我所有的源文件都经过UTF-8转换 我打开的所有文件都是UTF-8 我的应用程序正在打开UTF-8编码文件,该文件包含英语、波兰语和俄语三种语言的翻译文本,并将数据保存到一个文件中,分成3个单独的编码块:Windows-1250英语,Windows-1250波兰语和Windows-1251俄语-是的,这是一个文件中正确的Im混合编码类型,然后由知道如何处理的第三方设备使用 Iv得到了一个测试程序,该程序在Qt4下工作正常,现在它停止工作,文本保存为????????当我转到Qt5时: test_e

我所有的源文件都经过UTF-8转换

我打开的所有文件都是UTF-8

我的应用程序正在打开UTF-8编码文件,该文件包含英语、波兰语和俄语三种语言的翻译文本,并将数据保存到一个文件中,分成3个单独的编码块:Windows-1250英语,Windows-1250波兰语和Windows-1251俄语-是的,这是一个文件中正确的Im混合编码类型,然后由知道如何处理的第三方设备使用

Iv得到了一个测试程序,该程序在Qt4下工作正常,现在它停止工作,文本保存为????????当我转到Qt5时:

test_encoding.cpp

不带BOM的input.txt UTF-8

乌伊特科夫尼克·尼扎洛戈瓦尼

未登录用户

ззззззззз

output.txt多代码页块 ____第1区:

乌伊特科夫尼克·尼扎洛戈瓦尼

未登录用户

ззззззззз

乌伊特科夫尼克·尼扎洛戈瓦尼

未登录用户

ззззззззз

____第2区:

U࠹tkownik Niezalogwany

未登录用户

什么

U?ytkownik Niezalogwany

未登录用户

什么

____第3区:

U࠹tkownik Niezalogwany

未登录用户

什么

U?ytkownik Niezalogwany

未登录用户

什么

似乎可以只将文本保存到UTF-8,这不适合我-我需要使用代码页Windows-1251和Windows-1250


Qt5中是否有可能从UTF-8转换到其他代码页?

Qt 5中有一个错误,Iv向Qt报告:

目前的一种解决方法是,每次您想要更改代码页时,都要创建一个新的QTextStream对象—在执行QTextStream::flush之后,无法使用QTextStream::setCodec更改代码页—请检查上面链接中的错误描述。 问题出现在QIcuCodec::getConverter-source中的第5行

因此,在Qt 5中不起作用,但在Qt 4.8.4中起作用的代码是这样编写的:

QFile f;
QTextStream ts(&f);
ts.setCodec("Windows-1250");
ts << englishTranslationBlock();
ts << polishTranslationBlock();
ts.flush();
ts.setCodec("Windows-1251");
ts << russianTranslationBlock();
ts.flush();
f.close();
QFile f;
QTextStream* ts = new QTextStream(&f);
ts->setCodec("Windows-1250");
ts << englishTranslationBlock();
ts << polishTranslationBlock();
ts->flush();
delete ts;
ts = new QTextStream(&f);
ts->setCodec("Windows-1251");
ts << russianTranslationBlock();
ts->flush();
f.close();
要解决报告的错误,代码必须创建一个新的QTextStream以允许编解码器更改。以这种方式编写代码时,代码将正常工作:

QFile f;
QTextStream ts(&f);
ts.setCodec("Windows-1250");
ts << englishTranslationBlock();
ts << polishTranslationBlock();
ts.flush();
ts.setCodec("Windows-1251");
ts << russianTranslationBlock();
ts.flush();
f.close();
QFile f;
QTextStream* ts = new QTextStream(&f);
ts->setCodec("Windows-1250");
ts << englishTranslationBlock();
ts << polishTranslationBlock();
ts->flush();
delete ts;
ts = new QTextStream(&f);
ts->setCodec("Windows-1251");
ts << russianTranslationBlock();
ts->flush();
f.close();

我看到一个文件中有多个代码页,坦白说,这是胡说八道。如果分别编写这3个文件会发生什么?这不是胡说八道。转换文本的代码是更大的编译器的一部分,它为各种微控制器和DSP预编译代码。将所有文本放在一个文件中非常方便,实际上是一个C*.C表格声明文件-请检查链接。它可以支持任意数量的语言-如果我有几个文件,那么我必须生成许多ifdef并更正编译器。会发生什么?如果我将它保存到单独的文件中,它就可以工作了——但在我描述的方式之前,它在QT4中工作:1 setCodec 2 flush 3 setCodec。。。。。。等最终的输出来自哪里?如果是从编辑器复制粘贴的,则编辑器无法处理多个编码。我建议您使用十六进制编辑器检查该文件。Iv粘贴了一个完全用编辑器中的UTF-8编码的错误文件。从Windows-1250代码页编辑器粘贴的正确文件如下:源文件:。我做了一些测试,似乎出于某种原因QT5无法使用setCodec动态切换代码页。在QT4中,一切正常。如果我销毁QTextStream对象并为同一个QIODevice再次创建它,并设置代码页,它的工作方式与QT4中的相同:我检查了QT5的源代码,发现当触发第一个QTextStream::flush时,无论是由用户还是由系统强制执行,都会执行QIcuCodec::convertToUnicode并初始化转换后的代码。之后,程序检查转换器是否已初始化,如果已初始化,则未加载新的编解码器-第5行,当我强制调试器的可执行文件跳转到第7行时,即使在该行之前已初始化,转换仍会像在QT4中一样工作-setCodec on the fly!