crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Помогите с кодировками
sibmail
  опции профиля:
сообщение 11.2.2010, 13:54
Сообщение #1


Студент
*

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

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




Репутация:   0  


в программе я использую CP1251
в main.cpp написал следующее
QTextCodec *codec=QTextCodec::codecForName("CP1251");
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);

QString spec_symbol;
int code=255;
spec_symbol+=(char)code; //spec_symbol="я"

и теперь обратно от символа к коду

spec_symbol.at(0).unicode() //но здесь я уже получаю код 1103


Если в начале убрать QTextCodec *codec=QTextCodec::codecForName("CP1251");..... то все работает.

как получить корректный код???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 11.2.2010, 14:22
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

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




Репутация:   0  


что то я не понял, а что ты хотел получить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sibmail
  опции профиля:
сообщение 11.2.2010, 15:00
Сообщение #3


Студент
*

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

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




Репутация:   0  


хотел тот же код получить
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.2.2010, 15:03
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(sibmail @ 11.2.2010, 16:54) *
в программе я использую CP1251
устанавливаешь только
Цитата(sibmail @ 11.2.2010, 16:54) *
QTextCodec::setCodecForTr(codec);
локаль приложения менять не нужно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sibmail
  опции профиля:
сообщение 11.2.2010, 15:25
Сообщение #5


Студент
*

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 11.2.2010, 15:03) *
Цитата(sibmail @ 11.2.2010, 16:54) *
в программе я использую CP1251
устанавливаешь только
Цитата(sibmail @ 11.2.2010, 16:54) *
QTextCodec::setCodecForTr(codec);
локаль приложения менять не нужно


оставил только CodecForCString

все равно не работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vadim303
  опции профиля:
сообщение 11.2.2010, 15:29
Сообщение #6


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 18.1.2010
Пользователь №: 1382

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




Репутация:   0  


Имхо вы загоняете в QString символ я в кодировке cp1251, а потом получаете код этого символа в юникоде. Так что вполне логичный результат "я" как раз в юникоде имеет код 1103 (0x044F) ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sibmail
  опции профиля:
сообщение 11.2.2010, 15:40
Сообщение #7


Студент
*

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

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




Репутация:   0  


Цитата(vadim303 @ 11.2.2010, 15:29) *
Имхо вы загоняете в QString символ я в кодировке cp1251, а потом получаете код этого символа в юникоде. Так что вполне логичный результат "я" как раз в юникоде имеет код 1103 (0x044F) ;)


тогда подскажите как в моем случае получить код 255 из символа я
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.2.2010, 15:44
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(sibmail @ 11.2.2010, 18:25) *
оставил только CodecForCString

все равно не работает
а зачем ты его оставил?

Цитата(sibmail @ 11.2.2010, 18:40) *
тогда подскажите как в моем случае получить код 255 из символа я
toASCII?

Цитата(sibmail @ 11.2.2010, 16:54) *
spec_symbol+=(char)code; //spec_symbol="я"
и так лучше не присваивать, коль скоро с буковками работаешь. Используй fromASCII
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vadim303
  опции профиля:
сообщение 11.2.2010, 17:02
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 18.1.2010
Пользователь №: 1382

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




Репутация:   0  


Цитата(sibmail @ 11.2.2010, 15:40) *
тогда подскажите как в моем случае получить код 255 из символа я


Читаем хелп, там всё написано. Если вкратце, то т.к. QString хранит всё в юникоде, то оператор += должен преобразовать ваш восьмибитный символ в юникод. Он это делает с помощью кодека установленного с помощью QTextCodec::setCodecForCStrings(). В данном случае, т.к. установлен кодек cp1251, однобайтный символ с кодом 255 преобразуется в юникод (utf-16) c кодом 0x044F. Теперь чтобы получить обратно символ в кодировке cp1251 надо использовать преобразование с установленным соответствующим кодеком. Например вышеупомянутая функция toAscii() использует кодек QTextCodec::setCodecForCStrings() и в нашем случае это подходит. Также подойдёт функция toLocal8Bit(), т.к. мы также установили наш кодек и в QTextCodec::codecForLocale().

ну и на будущее да, чтобы было очевидней, какой кодек используем при загонке в QString используйте явные преобразования: fromLocal8Bit(), fromAscii(), tr() и т.п. иначе почаще пользуем хэлп :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 16.11.2019, 5:11