QT не может записать в файл Unicode строки Unicode - PullRequest
5 голосов
/ 29 ноября 2010

Я использую QT Creator, создал консольное приложение. Все актуально. ОС Windows XP.

Я создал QString, которая содержит несколько венгерских символов. Большинство венгерских символов не требуют Unicode, но символы с двойной косой чертой для акцента требуют Unicode.

Я пытаюсь записать содержимое QString в файл, но мои символы Юникода теряют свои акценты в файле. Другими словами, информация Юникода теряется по пути.

Мой код ниже.

#include <QtCore/QCoreApplication>
#include <QString>
#include <QTextStream>
#include <QDate>
#include <QFile>
using namespace std;


int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QString szqLine = "NON-UnicodeIsOK: áéüúöóí NEED-Unicode: űő";
    //These are Hungarian chars and require unicode. Actually, only the u & o, each having double
    //slashes for eccents require unicode encoding.

    //Open file for writing unicode chars to.
    QFile file("out.txt");
    if ( !file.open(QIODevice::WriteOnly | QIODevice::Text) ){
        return 1;
    }

    //Stream the QString text to the file.
    QTextStream out(&file);
    out.setCodec("UTF-8");

    out << szqLine << endl;     //Use endl for flush.  Does not properly write ű and ő chars.
                                //Accents missing in file.

    file.close();               //Done with file.

    return app.exec();
}

Ответы [ 2 ]

6 голосов
/ 29 ноября 2010
  1. Какая кодировка вашего файла?Использование кодировок не-ascii в исходных файлах часто вызывает проблемы, по крайней мере, при работе кроссплатформенно.Я думаю, что у MSVC есть некоторые проблемы.

  2. QString foo = "unicode string" использует неявное преобразование из ascii в unicode, что также вызовет проблемы.Всегда явно указывайте, какую кодировку использует литерал, например, оборачивая литерал с помощью QLatin1String (), если он latin1:

    QString foo = QLatin1String ("некоторая строка из латиницы 1");

или utf-8, как и должно быть в вашем случае, QString :: fromUtf8 ():

QString foo = QString::fromUtf8( "funny characters" );
Перед записью строки в файл (который является другим источником возможных ошибок, хотя ваш код выглядит правильно), проверьте, правильно ли отображает его виджет qt (например, QLineEdit).

Чтобы избежать таких ошибок, я предпочитаю сохранять исходные файлы в чистом ascii с английскими строками, а затем переводить их с помощью инструментов интернационализации Qt.

Редактировать: Также см. Принятый ответ на этот вопрос о литералах UTF-8 в MSVC 2008 .

1 голос
/ 29 ноября 2010

Вы уверены, что szqLine действительно содержит правильные символы?Попробуйте это: QString line = QString :: fromStdWString (L "NON-UnicodeIsOK: \ x00E1 \ x00E9 ... NEED-Unicode: \ x + 0171 \ x0151";

... и не использоватьВенгерская запись; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...