我的所有源文件都是UTF-8转换的。
我打开的所有文件都是UTF-8。
我的应用程序是打开UTF-8编码文件,其中包含3种语言的翻译文本:英语,波兰语和俄语,并将数据保存到3个独立的编码块中:Windows-1250(英语),Windows-1250(波兰语)和Windows-1251(俄语) - 是的,这是正确的混合编码类型在一个文件中,然后由第三方设备使用,知道如何处理它。
我有一个测试程序在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 << "\r\n";
t << cutf8->fromUnicode(d) << "\r\n";
t.flush();
// ____Block 2
t.setCodec(cw50);
t << d << "\r\n";
t << cw50->fromUnicode(d) << "\r\n";
t.flush();
// ____Block 3
t.setCodec(cw51);
t << d << "\r\n";
t << cw51->fromUnicode(d) << "\r\n";
t.flush();
}
ff.close();
QCoreApplication::quit();
}
input.txt(无BOM的UTF-8)
Użytkownikniezalogowany
未登录用户
Незарегистрированный
____第1区:
Użytkownikniezalogowany
未登录用户
Незарегистрированный
Użytkownikniezalogowany
未登录用户
Незарегистрированный
____ Block 2:
U࠹tkownikniezalogowany
未登录用户
?? ??????????????????
U?ytkownik niezalogowany
未登录用户
?? ??????????????????
____第3座:
U࠹tkownikniezalogowany
未登录用户
?? ??????????????????
U?ytkownik niezalogowany
未登录用户
?? ??????????????????
似乎可以将文本仅保存为不适合我的UTF-8 - 我需要使用代码页Windows-1251和Windows-1250。
在Qt5中是否可以将UTF-8转换为其他代码页?
答案 0 :(得分:4)
Qt 5中有一个错误,我向Qt报告: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以允许Codec更改。以这种方式编写时代码将起作用:
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();