Russian Qt Forum

Qt => Общие вопросы => Тема начата: gil9red от Января 19, 2016, 10:59



Название: Кодировки, кракозябры
Отправлено: gil9red от Января 19, 2016, 10:59
Пришла utf8 строка по сети "Не указана точка"
В корпоративной программе автоматом залогировалась как: "РќРµ указана точка"

Я как понимаю, декодировалась она как как однобайтовая, поэтому в два раза больше символов в кракозябре получилось.
Пытался сам с этим разобраться и нифига, а вот декодер (http://www.artlebedev.ru/tools/decoder/advanced/) смог разобраться и отписался: "
Как нам пришлось помучиться
CP1251 → UTF-8"

Пытался повторить сей подвиг, но не вышло
Код
C++ (Qt)
   QString s = "РќРµ";
 
   QTextCodec *codec = QTextCodec::codecForName("cp1251");
   qDebug() << codec->fromUnicode(s); // "? ??? ?µ"
 
   QTextCodec *codec1 = QTextCodec::codecForName("utf8");
   qDebug() << codec1->toUnicode(codec->fromUnicode(s)); // "????????"
 

Подскажите, как этой магией кодировок овладеть? :)


Название: Re: Кодировки, кракозябры
Отправлено: Old от Января 19, 2016, 11:51
Не буду по сотому разу все повторять, было уже масса тем на форме, где все это разжевывалось. ;)

Пришла utf8 строка по сети "Не указана точка"
В корпоративной программе автоматом залогировалась как: "РќРµ указана точка"
По сети пришла строка в utf8, ее вы получаете в QByteArray (внимание! не в QString), дальше нужно воспользоваться кодеком utf8, для перевода этой строки в unicode QString.

Код
C++ (Qt)
QTextCodec *codec = QTextCodec::codecForName("utf8");
 
QByteArray data = socket.readAll();
QString str = codec->toUnicode( data );
 


Название: Re: Кодировки, кракозябры
Отправлено: gil9red от Января 19, 2016, 12:20
Не буду по сотому разу все повторять, было уже масса тем на форме, где все это разжевывалось. ;)

Пришла utf8 строка по сети "Не указана точка"
В корпоративной программе автоматом залогировалась как: "РќРµ указана точка"
По сети пришла строка в utf8, ее вы получаете в QByteArray (внимание! не в QString), дальше нужно воспользоваться кодеком utf8, для перевода этой строки в unicode QString.

Код
C++ (Qt)
QTextCodec *codec = QTextCodec::codecForName("utf8");
 
QByteArray data = socket.readAll();
QString str = codec->toUnicode( data );
 


Я не могу во внутренности залесть и поменять ) Да и там ява крутится )
Хочу ту кракозябру перекодировать в читаемый вид :)


Название: Re: Кодировки, кракозябры
Отправлено: Old от Января 19, 2016, 12:45
Я не могу во внутренности залесть и поменять ) Да и там ява крутится )
Хочу ту кракозябру перекодировать в читаемый вид :)
А понятно. :)
Код
C++ (Qt)
QByteArray textWin = file.readAll();    // Читаете из файла в QByteArray - это строка в CP1251
 
QTextCodec *codec = QTextCodec::codecForName( "windows-1251" );
QString textOk = codec->toUnicode( textWin );
 


Название: Re: Кодировки, кракозябры
Отправлено: gil9red от Января 19, 2016, 13:11
Код:
[quote author=Old link=topic=29723.msg218275#msg218275 date=1453196707]
[quote author=gil9red link=topic=29723.msg218272#msg218272 date=1453195238]
Я не могу во внутренности залесть и поменять ) Да и там ява крутится )
Хочу ту кракозябру перекодировать в читаемый вид :)
[/quote]
А понятно. :)
[code=cpp]
QByteArray textWin = file.readAll();    // Читаете из файла в QByteArray - это строка в CP1251

QTextCodec *codec = QTextCodec::codecForName( "windows-1251" );
QString textOk = codec->toUnicode( textWin );

Спасибо, помогло: создал файл в кодировке cp1251 и считал его:
Код
   QFile f("t");
   f.open(QIODevice::ReadOnly);
 
   QTextCodec *codec = QTextCodec::codecForName( "utf-8" );
   QString textOk = codec->toUnicode( f.readAll() );
   qDebug() << textOk;
 
// UPDATE. Не помогло
// Тоже самое:
   QByteArray c = "РќРµ указана точка"
 
   QTextCodec *codec = QTextCodec::codecForName( "utf-8" );
   QString textOk = codec->toUnicode( с );
   qDebug() << textOk;
[/code]


Название: Re: Кодировки, кракозябры
Отправлено: kambala от Января 19, 2016, 14:36
либо просто использовать QString QString::fromUtf8(const QByteArray & str)


Название: Re: Кодировки, кракозябры
Отправлено: gil9red от Января 19, 2016, 15:04
либо просто использовать QString QString::fromUtf8(const QByteArray & str)

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

    QByteArray c = "РќРµ указана точка";
    qDebug() << QString::fromUtf8(c);

Выведет
"Не указана точка"


Название: Re: Кодировки, кракозябры
Отправлено: dddasd от Января 19, 2016, 15:45
Кодировка ваших исходников (*.cpp) в utf-8, поэтому так не работает, надо перекодировать в windows-1251. тогда будет наверное работать.


Название: Re: Кодировки, кракозябры
Отправлено: Bepec от Января 19, 2016, 17:35
Почему это происходит? Потому что строка эта в ANSI, а вы копируете её в исходники, а исходники QtCreator имеют кодировку UTF-8.

Чтоб понятнее было(да и сам ещё раз убедился), вот такой код
Код:
    
QByteArray b = "Не указана точка";
    qDebug() << b;
    QFile file("d:/1.txt");
    file.open(QIODevice::ReadOnly);
    QByteArray d(file.readAll());
    qDebug() << d;
В файлике в кодировке UTF-8 находится ваша строка.
Результат:
Строка в исходниках
"\xD0\xA0\xD1\x9C\xD0\xA0\xC2\xB5 \xD0\xA1\xD1\x93\xD0\xA0\xD1\x94\xD0\xA0\xC2\xB0\xD0\xA0\xC2\xB7\xD0\xA0\xC2\xB0\xD0\xA0\xD0\x85\xD0\xA0\xC2\xB0 \xD0\xA1\xE2\x80\x9A\xD0\xA0\xD1\x95\xD0\xA1\xE2\x80\xA1\xD0\xA0\xD1\x94\xD0\xA0\xC2\xB0"

Правильное байтовое представление из файла
"\xD0\x9D\xD0\xB5 \xD1\x83\xD0\xBA\xD0\xB0\xD0\xB7\xD0\xB0\xD0\xBD\xD0\xB0 \xD1\x82\xD0\xBE\xD1\x87\xD0\xBA\xD0\xB0"


Но достаточно изменить кодировку исходников в ANSI и забьём туда строку "Не найдена точка" и результат будет в обоих случаях правильный.


Название: Re: Кодировки, кракозябры
Отправлено: Old от Января 19, 2016, 18:13
Нет, не поможет, когда проверял вашу подсказку заметил, что в своем коде вышел ошибся, так что

    QByteArray c = "РќРµ указана точка";
    qDebug() << QString::fromUtf8(c);

Выведет
"Не указана точка"
Не нужно так проверять. Как только вы вставили эту строку в исходники, она превратилась в строку в utf-8. И дальше вы эту строку с крякозябрами в кодировки utf-8 пытаетесь во что-то конвертировать и она прекрасно конвертируется в такие же крякозябры. :)


Название: Re: Кодировки, кракозябры
Отправлено: gil9red от Января 19, 2016, 18:20
Спасибо за пояснения :)