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

时间:2014-11-07 14:25:20

标签: c++ utf-8 character-encoding qt5 qt4.8

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

     

未登录用户

     

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

  • output.txt(多代码页面块)
  

____第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转换为其他代码页?

1 个答案:

答案 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();