我的所有源文件都经过UTF-8转换。
我打开的所有文件都是UTF-8。
我的应用程序正在打开UTF-8编码的文件,该文件包含3种语言的翻译文本:英语、波兰语和俄语,并将数据保存到一个文件中,分为3个单独的编码块:Windows-1250(英语)、Windows-1250和Windows-1251(俄语)-是的,没错,我在一个文件内混合了编码类型,然后由知道如何处理的第三方设备使用。
Iv得到了一个在Qt4下完美工作的测试程序,现在当我转到Qt5:时,它停止了工作(文本保存为????)
-
test_encoding.cpp
test_encoding::test_encoding(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); QString d; QFile f(QDir::currentPath() + "/input.txt"); if( f.open( QIODevice::ReadOnly | QIODevice::Text ) ) { d = f.readAll(); f.close(); } QFile ff(QDir::currentPath() + "/output.txt"); if( ff.open( QIODevice::WriteOnly | QIODevice::Text ) ) { QTextStream t(&ff); auto cutf8 = QTextCodec::codecForName("UTF-8"); auto cw50 = QTextCodec::codecForName("windows-1250"); auto cw51 = QTextCodec::codecForName("windows-1251"); // ____Block 1 t.setCodec(cutf8); t << d << "rn"; t << cutf8->fromUnicode(d) << "rn"; t.flush(); // ____Block 2 t.setCodec(cw50); t << d << "rn"; t << cw50->fromUnicode(d) << "rn"; t.flush(); // ____Block 3 t.setCodec(cw51); t << d << "rn"; t << cw51->fromUnicode(d) << "rn"; t.flush(); } ff.close(); QCoreApplication::quit(); }
-
input.txt(UTF-8,无BOM)
乌克兰
未登录用户
- output.txt(多代码页块)
____区块1:
乌克兰
未登录用户
乌克兰
未登录用户
____区块2:
U࠹tkownik niezalogowany
未登录用户
U?ytkovnik niezalogowany
未登录用户
____区块3:
U࠹tkownik niezalogowany
未登录用户
U?ytkovnik niezalogowany
未登录用户
似乎可以只将文本保存为UTF-8,这对我来说不合适——我需要使用代码页Windows-1251和Windows-1250。
在Qt5中,是否可以从UTF-8转换为其他代码页?
Iv向Qt报告了Qt 5中的一个错误:https://bugreports.qt.io/browse/QTBUG-42498
目前的解决方法是,每次您想要更改代码页时都创建一个新的QTextStream对象-在执行了QTextStream::flush()之后,不可能使用QTextStream::setCodec()更改代码页-请查看上面链接中的错误描述。问题出现在QIcuCodec::getConverter()源代码的第5行中http://pastebin.com/2dEcCyET
因此,在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();
为了解决报告的错误,代码必须创建一个新的QTextStream以允许编解码器进行更改。代码以这种方式编写时将起作用:
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();