Russian Qt Forum
Ноябрь 24, 2024, 07:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Кодировки, кракозябры  (Прочитано 8745 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Январь 19, 2016, 10:59 »

Пришла utf8 строка по сети "Не указана точка"
В корпоративной программе автоматом залогировалась как: "РќРµ указана точка"

Я как понимаю, декодировалась она как как однобайтовая, поэтому в два раза больше символов в кракозябре получилось.
Пытался сам с этим разобраться и нифига, а вот декодер смог разобраться и отписался: "
Как нам пришлось помучиться
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)); // "????????"
 

Подскажите, как этой магией кодировок овладеть? Улыбающийся
Записан

Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Январь 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 );
 
« Последнее редактирование: Январь 19, 2016, 11:57 от Old » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Январь 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 );
 


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

Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Январь 19, 2016, 12:45 »

Я не могу во внутренности залесть и поменять ) Да и там ява крутится )
Хочу ту кракозябру перекодировать в читаемый вид Улыбающийся
А понятно. Улыбающийся
Код
C++ (Qt)
QByteArray textWin = file.readAll();    // Читаете из файла в QByteArray - это строка в CP1251
 
QTextCodec *codec = QTextCodec::codecForName( "windows-1251" );
QString textOk = codec->toUnicode( textWin );
 
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Январь 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]
« Последнее редактирование: Январь 19, 2016, 15:03 от gil9red » Записан

kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Январь 19, 2016, 14:36 »

либо просто использовать QString QString::fromUtf8(const QByteArray & str)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #6 : Январь 19, 2016, 15:04 »

либо просто использовать QString QString::fromUtf8(const QByteArray & str)

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

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

Выведет
"Не указана точка"
Записан

dddasd
Гость
« Ответ #7 : Январь 19, 2016, 15:45 »

Кодировка ваших исходников (*.cpp) в utf-8, поэтому так не работает, надо перекодировать в windows-1251. тогда будет наверное работать.
Записан
Bepec
Гость
« Ответ #8 : Январь 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 и забьём туда строку "Не найдена точка" и результат будет в обоих случаях правильный.
« Последнее редактирование: Январь 19, 2016, 17:41 от Bepec » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Январь 19, 2016, 18:13 »

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

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

Выведет
"Не указана точка"
Не нужно так проверять. Как только вы вставили эту строку в исходники, она превратилась в строку в utf-8. И дальше вы эту строку с крякозябрами в кодировки utf-8 пытаетесь во что-то конвертировать и она прекрасно конвертируется в такие же крякозябры. Улыбающийся
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #10 : Январь 19, 2016, 18:20 »

Спасибо за пояснения Улыбающийся
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.184 секунд. Запросов: 24.