繁体   English   中英

Qt 5编码问题(UTF-8,Windows-1250,Windows-1251)

[英]Qt 5 encoding problems (UTF-8, Windows-1250, Windows-1251)

我所有的源文件都是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 << "\\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)

Uyykknik niezalogowany

未登录用户

Незарегистрированный

  • output.txt(多代码页块)

____区块1:

Uyykknik niezalogowany

未登录的用户

Незарегистрированный

Uyykknik niezalogowany

未登录用户

Незарегистрированный

____块2:

乌特科夫尼克niezalogowany

未登录用户

?? ??????????????????

U?ytkownik niezalogowany

未登录用户

?? ??????????????????

____块3:

乌特科夫尼克niezalogowany

未登录的用户

?? ??????????????????

U?ytkownik 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()更改代码页-检查上面链接中的错误说明。 问题是在第5行中QIcuCodec的源:: getConverter() - 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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM