crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Вместо буквы 'Ш' получается '?', При изменении кодировки с 1251 на 866 пропадает буква Ш
sibmail
  опции профиля:
сообщение 20.4.2010, 13:35
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 63
Регистрация: 20.3.2009
Пользователь №: 626

Спасибо сказали: 0 раз(а)




Репутация:   0  


Пример кода
...
QTextCodec *codec=QTextCodec::codecForName("CP1251");
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
...
...

QTextCodec *codec_send = QTextCodec::codecForName("IBM-866");

QString mes_send="ШИШ;
emit message (mes_send); //выводит "ШИШ"

mes_send=codec_send->fromUnicode(mes_send);

emit message (mes_send); //что то там выводит...

mes_send=codec_send->toUnicode(mes_send);

emit message (mes_send); //выводит "?И?"

подскажите что делать?
(qt3.3)

Сообщение отредактировал sibmail - 20.4.2010, 13:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 20.4.2010, 14:07
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(sibmail @ 20.4.2010, 14:35) *
(qt3.3)


Qt 4.6.2 проблем не наблюдаю:

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sibmail
  опции профиля:
сообщение 21.4.2010, 4:20
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 63
Регистрация: 20.3.2009
Пользователь №: 626

Спасибо сказали: 0 раз(а)




Репутация:   0  


еще кто что посоветует?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 21.4.2010, 9:34
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Вам уже вчера ответили на другом форуме, что вы глупость написали тут:

mes_send=codec_send->fromUnicode(mes_send);


fromUnicode() возвращает QByteArray, а mes_send - QString. Происходит неявное преобразование QByteArray в QString, при котором используется установленный кодек codecForCStrings, то есть cp1251. Вот и подумайте, что может получится, если попытаться преобразовать текст в кодировке cp866 в Unicode заставляя думать кодек, что это кодировка cp1251.

Цитата
подскажите что делать?

Поставить задачу конкретней. Даже если решить вопрос с преобразованием кодировок туда и обратно, то может остаться проблема с выводом текста, где может опять же происходить неявное кодирование. Чтобы понять будет ли там проблема нужно смотреть код слота на сигнал message. Но могу уже сейчас сказать, что QString в качестве параметра для сигнала уже не подходит для вывода текста в разных кодировках. В QString всегда Unicode.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sibmail
  опции профиля:
сообщение 21.4.2010, 11:43
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 63
Регистрация: 20.3.2009
Пользователь №: 626

Спасибо сказали: 0 раз(а)




Репутация:   0  


Детально: в программе формируются строки для посылки, строка состоит из ранзых блоков (в зависимости от протокола).
Я не могу перекодировать все данные перед отправкой, т.к. в служебной части строки есть данные которые нельзя менять.
...
QTextCodec *codec=QTextCodec::codecForName("CP1251");
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
...
...
QString mes_send1="12345;
QString mes_send2="ШИШ2;
QString mes_send3="ШИШ3;

QTextCodec *codec_send = QTextCodec::codecForName("IBM-866");

mes_send2=codec_send->fromUnicode(mes_send2);
mes_send3=codec_send->fromUnicode(mes_send3);

QString array_Strings[n_devices][1];

array_Strings[0][0]=mes_send2;
array_Strings[1][0]=mes_send3;

QString MES_SEND=mes_send1+array_Strings[0][0]+array_Strings[1][0]; //часть строки должна быть в IBM-866

m_psocket->writeBlock(MES_SEND, MES_SEND.length());
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 21.4.2010, 11:47
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Вместо массива строк используй QByteArray и миксуй там кодировки как тебе заблогарассудится.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sibmail
  опции профиля:
сообщение 21.4.2010, 17:18
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 63
Регистрация: 20.3.2009
Пользователь №: 626

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 21.4.2010, 12:47) *
Вместо массива строк используй QByteArray и миксуй там кодировки как тебе заблогарассудится.


подскажите как в qt3 сразу два QByteArray
QString str1="ШИШ";
QByteArray ba1, ba2;

ba1="12345"+QCString(str1);
ba2="67890";
ba1=ba1+ba2; // - ВОТ ЗДЕСЬ МНЕ НАДО СЛОЖИТЬ. НА ЭТО ba1=ba1+ba2 - РУГАЕТСЯ
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 21.4.2010, 17:56
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Никак QByteArray в Qt3 это обычный typedef статический массив QMemArray<char>. Для динамики нужно использовать QValueVector<char>. Но тебе виднее, я начинал изучение с Qt4.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 17:57