Qt 5编码问题(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 << "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();

相关内容

  • 没有找到相关文章

最新更新