Создать файл UTF-8 в Qt - PullRequest
18 голосов
/ 24 января 2011

Я пытаюсь создать кодированный файл UTF-8 в Qt.

#include <QtCore>

int main()
{
    QString unicodeString = "Some Unicode string";
    QFile fileOut("D:\\Temp\\qt_unicode.txt");
    if (!fileOut.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        return -1;
    }

    QTextStream streamFileOut(&fileOut);
    streamFileOut.setCodec("UTF-8");
    streamFileOut << unicodeString;
    streamFileOut.flush();

    fileOut.close();

    return 0;
}

Я подумал, когда QString по умолчанию является Unicode и когда я установил кодек выходного потока в UTF-8, мой файл будет UTF-8. Но это не так, это ANSI. Что я делаю не так? Что-то не так с моими строками? Можете ли вы исправить мой код для создания файла UTF-8? Следующим шагом для меня будет чтение файла ANSI и его сохранение в виде файла UTF-8, поэтому мне придется выполнить преобразование для каждой прочитанной строки, но сейчас я хочу начать с файла. Спасибо.

Ответы [ 3 ]

16 голосов
/ 24 января 2011

Ваш код абсолютно правильный. Единственное, что мне кажется подозрительным, это:

QString unicodeString = "Some Unicode string";

Вы понимаете, что вы не можете просто поместить строку Unicode в кавычки, не так ли? По умолчанию QString использует Latin1, поэтому, если речь идет только об акцентированных символах, у вас, вероятно, все в порядке, но лучше, чтобы ваш исходный кодировался в UTF-8 и делал это:

QString unicodeString = QString::fromUtf8("Some Unicode string");

Это будет работать для любого мыслимого языка. Использование QObject :: trUtf8 () еще лучше, поскольку оно дает вам много возможностей i18n.

Редактировать

Хотя это правда, что вы генерируете правильный файл UTF-8, если вы хотите, чтобы Notepad распознал ваш файл как UTF-8, это другая история. Вам нужно поставить спецификацию там. Это можно сделать либо как предложено в другом ответе, либо здесь другим способом:

streamFileOut.setGenerateByteOrderMark(true);
8 голосов
/ 24 января 2013

Мой опыт создания TXT-кодировки UTF-8 без спецификации с помощью QT:

file.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(&file);
out.setCodec("UTF-8"); // ...
vcfline = ctn; //assign some utf-8 characters
out.setGenerateByteOrderMark(false);
out << vcfline; //.....
file.close();

И файл будет кодировать UTF-8 без спецификации.

5 голосов
/ 24 января 2011

Не забывайте, что кодировка UTF-8 будет кодировать символы ASCII одним байтом. Только специальные или акцентированные символы будут кодироваться с большим количеством байтов (от 2 до 6 байтов).

Это означает, что до тех пор, пока у вас есть символы ASCII (как в случае с unicodeString), файл будет содержать только 8 байтовых символов. Таким образом, вы получаете обратную совместимость с ASCII:

UTF-8 может представлять каждый символ в наборе символов Unicode, но в отличие от них обладает преимуществами обратной совместимости с ASCII

Чтобы проверить, работает ли ваш код, вы должны поместить, например, несколько акцентированных символов в ваш юникод.

Я проверил ваш код с выделенными символами, и он работает нормально.

Если вы хотите иметь BOM в начале вашего файла, вы можете начать с добавления символа BOM (QChar(QChar::ByteOrderMark)).

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