LINUX.ORG.RU

Правильное преобразование кодировки в QString

 , ,


0

1

Есть библиотека, которая в качестве аргументов метода принимает QString.
Но строка должна быть в IBM 866.

QTextCodec::fromUnicode(string) отдаёт QByteArray. Если его перегнать в QString, то в место символов стоят знаки вопроса.

Как правильно преобразовать QByteArray в QString?

★★

Но строка должна быть в IBM 866.

WAT? QString внутри себя всегда в UCS-2 строку хранит. А QString(const QByteArray&), ЕМНИП, перегоняет строку через fromLatin1(), т.е. считает что QByteArray в Latin1

Kosyak ★★★★
()
Ответ на: комментарий от Kosyak

QString внутри себя всегда в UCS-2 строку хранит

А не в UTF-16?

XMs ★★★★★
()

Выдержка из доков:

The QString class provides a Unicode character string.
QString stores a string of 16-bit QChars, where each QChar corresponds one Unicode 4.0 character. (Unicode characters with code values above 65535 are stored using surrogate pairs, i.e., two consecutive QChars.)

И как ты собрался хранить в QString IBM 866?

Noob_Linux ★★★★
()

Но строка должна быть в IBM 866.

Вот этот момент не понятен. Какая строка? Которая у тебя, или которая должна быть уже внутри переданной в библиотеке? Почему должна быть? Больше подробностей.

Chaser_Andrey ★★★★★
()
QByteArray ibm("text");
QTextCodec *codec = QTextCodec::codecForName("IBM 866");
QString unicode = codec->toUnicode(ibm);

Хранить не Unicode в QString невозможно.

anonymous
()
Ответ на: комментарий от SaBo

А что делать, если либа принимает QString и мне надо передать его в 866?

Если кодишь для себя, то в половой орган такую библиотеку!

Если по работе, то начинай искать новую работу, т к если дураки засовывают в QString левую кодировку, то одной глупостью они не ограничатся.

По сути: у QString есть метод data, который возвращает не константный указатель на внутренние данные. Попробуй с помощью этого указателя и явного преобразования QChar* к сhar* записать поверху свои данные.

AF ★★★
()

Kosyak XMs Noob_Linux Chaser_Andrey AF

Вот рабочий пример преобразования QString из одной кодировки в другую (исходник в UTF-8):

QString desc = QString("test абвгдеёжз");
QTextCodec *codec = QTextCodec::codecForName("IBM 866");
QTextStream in(codec->fromUnicode(desc), QIODevice::ReadOnly | QIODevice::Text);
QString result = in.readLine();

result - QString в IBM 866.

Пример использования.

SaBo ★★
() автор топика
Ответ на: комментарий от Chaser_Andrey

Это было продолжение вот этой темы. Если интересно, то там есть подробности зачем и почему. Решение проблемы см. выше.

SaBo ★★
() автор топика
Ответ на: комментарий от SaBo

Чего и следовало ожидать. Правильно тебе AF советовал выкинуть эту библиотеку, раз для неё такой изврат нужен

XMs ★★★★★
()
Ответ на: комментарий от SaBo

Походу фигня написана!

QString(«test абвгдеёжз») у себя внутри будет вызывать QString::fromAscii, и если строка на самом деле в UTF-8, то она будет безнадежно испорчена!

Второй момент - QTextStream юзает у себя внутри QTextCodec, для того, чтобы генерировать из бинарных данных корректные экземпляры QString. Т е из условно правильной строки в «IBM 866» внутри QTextStream, будет получена какая то перекодированная хрень!

AF ★★★
()
Ответ на: комментарий от SaBo

Понятия не имею, что у тебя за система, но у меня в result после пробела 16 байт с одинаковым значением 63.

Если шо, такой код более правильный:

    QString desc = QString::fromUtf8("test абвгдеёжз");
    QTextCodec *codec = QTextCodec::codecForName("IBM 866");
    QString result(codec->fromUnicode(desc));

Но я не уверен, что в последнем преобразовании всегда все будет корректно.

AF ★★★
()
Последнее исправление: AF (всего исправлений: 1)
Ответ на: комментарий от AF

Мы точно о Qt5 говорим?

QString result(codec->fromUnicode(desc));

Нет, так неправильно. QString пытается преобразовать QByteArray из одной кодировки в другую. И все символы заменяет знаками вопроса.

SaBo ★★
() автор топика
Ответ на: комментарий от SaBo

На этом примере что Qt5, что Qt4 работаю одинаково! Да и откуда разнице браться?

QString пытается преобразовать QByteArray из одной кодировки в другую

Да, тут ты прав, я спутал двухбайтовые символы и однобайтовые.
Однако у меня там отнюдь не знаки вопроса ;)

Ну и твой in.readLine(); тоже внутри перекодирует.

AF ★★★
()
Ответ на: комментарий от SaBo
QString desc = QString("test абвгдеёжз"); // берем строку в UTF
QTextCodec *codec = QTextCodec::codecForName("IBM 866");
QTextStream in(codec->fromUnicode(desc), QIODevice::ReadOnly | QIODevice::Text); // переводим её в IBM 866
QString result = in.readLine(); // обратно переводим её в UTF

не? можно доказательства того что там IBM 866?

Noob_Linux ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.