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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с передачей русской строки.  (Прочитано 4572 раз)
mad Mr F.
Гость
« : Октябрь 07, 2010, 21:58 »

Цель передать русскую строку по сети. Когда отправляю из строки через toUtf8 получаю массив байт и к нему добавляю шапку свою. Когда принимаю то убираю шапку и через fromUtf8 получаю строку.
Для наглядности приведу выдержки из кода.
В main.cpp:
Код
C++ (Qt)
...
QTextCodec::setCodecForTr( QTextCodec::codecForName( "Windows-1251"));
...
 
На стороне отправителя:
Код
C++ (Qt)
sendString( QString message){
   messageHeader header;
   ...
   QByteArray resMessage = message.toUtf8();
   resMessage.prepend( (const char *)&header, sizeof( messageHeader));
   p_udpSocket->writeDatagram( resMessage.data(), resMessage.size(), p_remoteIp, p_remotePort);
}
 
при отправке пишу sendStr( tr( "Привет!")). Функции эти являются методами обьектов ( наследники QObject).
На стороне получателя:
Код
C++ (Qt)
QString getStr(){
       QByteArray message;
       message.resize( p_udpSocket->pendingDatagramSize());
       p_udpSocket->readDatagram( message.data(), message.size());
...
       message = QByteArray( &(message.data()[sizeof( messageHeader)]), message.size() - sizeof( messageHeader));
       return QString::fromUtf8 ( message.data(), message.size());
 
Это не реальный код, так что об оптимальности вопроса не стоит. Подобное в линуксе замечательно работает. А в винде в начале строки добавляются какие-то иероглифы( в 7-ке что-то типа перевернутой буквы "г" а в ХР четыре квадрата), но сама строка присутствует целиком.
Я, если честно, даже куда искать уже не совсем понимаю... Расскажите что не так)
Записан
garryHotDog
Гость
« Ответ #1 : Октябрь 08, 2010, 09:12 »

попробуй указать кодеки...как то так ():

Код
C++ (Qt)
#include <QCoreApplication>
#include <QTextCodec>
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));

это для винды соот-но.....
Записан
mad Mr F.
Гость
« Ответ #2 : Октябрь 08, 2010, 10:31 »

Ну
TextCodec::setCodecForCString(QTextCodec::codecForName("Windows-1251"));
Я еще могу понять, но для локали-то
TextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
зачем?
Записан
andrew.k
Гость
« Ответ #3 : Октябрь 08, 2010, 11:15 »

Это не реальный код, так что об оптимальности вопроса не стоит. Подобное в линуксе замечательно работает. А в винде в начале строки добавляются какие-то иероглифы( в 7-ке что-то типа перевернутой буквы "г" а в ХР четыре квадрата), но сама строка присутствует целиком.
Я, если честно, даже куда искать уже не совсем понимаю... Расскажите что не так)
Прочитай раздел "Порядок байтов".
http://ru.wikipedia.org/wiki/UTF-8
Они мешают тебе? Думаю, они должны обрабатываться QString'ом автоматически и для тебя быть прозрачными
Записан
mad Mr F.
Гость
« Ответ #4 : Октябрь 08, 2010, 11:43 »

Если это они то QString их как-то плохо обрабатывает. Полученная строка добавляется в QTextBrowser. И, как писал выше, под линуксом их нет, а под виндой появляются.
Записан
andrew.k
Гость
« Ответ #5 : Октябрь 08, 2010, 12:36 »

Если это они то QString их как-то плохо обрабатывает. Полученная строка добавляется в QTextBrowser. И, как писал выше, под линуксом их нет, а под виндой появляются.
То что это они, это точно.
Я под виндой делал html в utf и редактор в котором я его делал тоже добавил три байта (EF BB BF). Дальше этот html отображаю в QTextBrowser. Никаких проблем не возникает. Что-то делаешь не так.
Записан
andrew.k
Гость
« Ответ #6 : Октябрь 08, 2010, 12:38 »

кстати, можешь провести эксперимент. Не добавляй в свою строку русский текст. только чисто латиница. Твои "друзья" должны пропасть, хотя не факт, просто предполагаю Улыбающийся
Записан
mad Mr F.
Гость
« Ответ #7 : Октябрь 08, 2010, 12:53 »

Так я и пишу про проблему с русским. Латиницей "друзей" нет)
Записан
andrew.k
Гость
« Ответ #8 : Октябрь 08, 2010, 14:12 »

Так я и пишу про проблему с русским. Латиницей "друзей" нет)
Ну значит это они и есть. Это метка порядка байтов. Если набор полностью латиницей, то метка не нужна.
Обрати внимание, что метка состоит из трех байт имеющих предопределенное значение.
А у тебя 4 байта с твоих слов.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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