Как использовать символы Юникода в QString / QDebug?

Возможный дубликат:
Я теряю «уникальность» при использовании qDebug () после создания QApplication

Я пытаюсь использовать символы Unicode в моем проекте, но символы Unicode конвертируются в некоторые значения (например:?).

#include <QtCore/QCoreApplication>
#include <QTextCodec>
#include <QDebug>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForCStrings(codec);
//Unicode character here is '
QString unicode = "Hello I’ve to go";
qDebug() << "Unicode String: " << unicode;
return a.exec();
}

Приведенный выше код печатает строковое значение как Здравствуйте, я должен идти

0

Решение

В C ++ 11 добавлена ​​поддержка символов Юникода. Попробуйте правильно экранировать этот символ Юникода:

u8"Hello I\u2019ve to go"

Это работает для меня. Хотя вполне возможно, что у вас нет шрифта U + 2019 в вашем шрифте, поэтому он рисует его как ? вместо правильного характера.

2

Другие решения

Строковые литералы преобразуются компилятором из исходной кодировки в кодировку выполнения. Используемая вами кодировка выполнения, очевидно, не может обработать этот символ, поэтому она заменяется на «?».

Вам нужно либо выбрать другую кодировку выполнения, если ваш компилятор поддерживает это (gcc делает с флагом -fexec-charset) или обмануть компиляторы, которые этого не поддерживают (например, Visual Studio), чтобы они не выполняли это преобразование, лгая ему о том, что такое исходная кодировка.

Вы можете лгать VS об исходной кодировке, устанавливая исходный код в UTF-8 без подписи. VS будет предполагать, что исходная кодировка — это «кодировка системы для программ, не поддерживающих Юникод», которая аналогична той, что используется для кодирования выполнения. Поскольку он будет считать, что кодировки одинаковы, он не будет выполнять никакого преобразования, а строковым литералом будет UTF-8. Вы должны быть осторожны, чтобы избежать чего-либо еще в вашем исходном коде, когда компилятор должен знать правильную кодировку. Например, если вы сделаете это, широкие строковые литералы не будут правильно преобразованы.

Другим решением были бы новые строковые литералы C ++ 11 UTF-8: u8"Hello I’ve to go", Они преобразуются компилятором из исходной кодировки в UTF-8, а не в кодировку выполнения. К сожалению, Visual Studio пока не поддерживает строковые литералы UTF-8.


В комментарии выше вы говорите: «В моем реальном проекте это значение читается из имени файла». Это указывает на совершенно другую проблему, чем та, которая была продемонстрирована в вашем вопросе. Решение этой проблемы потребует подробностей о том, как именно вы получите имя файла.

Если вы покажете, как исправить код, который вы опубликовали, это не исправит вашу реальную проблему, потому что проблема в коде, который вы опубликовали, и ваша реальная проблема разные. Не будет «общего решения», которое решает оба.

0

test.txt (UTF-8)

Здравствуйте, я должен идти.

Вот еще один тест.

main.cpp

#include <QtCore>

int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QString unicode = QString::fromUtf16(L"Hello I\u2019ve to go");
qDebug() << "Unicode String: " << unicode;

QFile in_file("test.txt");

if (!in_file.open(QIODevice::ReadOnly | QIODevice::Text)) {
return -1;
}

QTextStream in(&in_file);
while(!in.atEnd()) {
QString line = in.readLine();
qDebug() << line;
}
}

Выход:

Unicode String:  "Hello I’ve to go""Hello I’ve to go.""Here is another test."

Он работает с жестко заданным значением и значением, считанным во время выполнения. Я подозреваю, что в тот момент, когда вы читаете файл, что-то идет не так, то есть вы используете неправильную кодировку или конвертируете в кодировку Latin-1 или что-то в этом роде.

0
По вопросам рекламы [email protected]