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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: корректное преобразование символа в системную кодировку  (Прочитано 6267 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« : Апрель 18, 2011, 19:34 »

Здравствуйте. Есть ли универсальный способ преобразовать символ в текущую кодировку системы зная его код?

Пример: надо преобразовать символ с кодом 0xFF (не юникод!). В win-1251 это будет символ 'я' (юникод 044F), а в MacRoman - 'ˇ' (юникод 02C7). Уже по-всякому крутил и QTextCodec, и toLocal8Bit() - и все не то, постоянно выдает мне только юникод 00FF (или вообще ничего).

Понимаю, что можно сделать через #ifdef, но хотелось бы универсальный способ.

З.Ы. ну и еще надо этот символ вывести через QDataStream. там постоянно мне выдает utf-8 его представление - C3BF. но тут можно обойтись и с помощью quint8(0xFF) Улыбающийся
Записан

Изучением 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
SABROG
Гость
« Ответ #1 : Апрель 18, 2011, 21:53 »

зная его код?

Встречный вопрос. А ты можешь преобразовать символ в системную кодировку зная один из его кодов
0xFF
044F
02C7
C3BF

, но не зная какой из кодов какой кодировке принадлежит?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Апрель 18, 2011, 22:04 »

нет.

но я же хочу указать, что надо преобразовывать именно из локальной 8-битной, какой бы она там ни была.
Записан

Изучением 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
SABROG
Гость
« Ответ #3 : Апрель 19, 2011, 07:58 »

нет.

но я же хочу указать, что надо преобразовывать именно из локальной 8-битной, какой бы она там ни была.
Цитировать
Есть ли универсальный способ преобразовать символ в текущую кодировку системы зная его код?

Т.е. из системной локальной кодировки одного компьютера в системную локальную кодировку другого?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Апрель 19, 2011, 09:30 »

ну в принципе да.

может я немного непонятно сформулировал вопрос. известен код символа в локальной 8-битной кодировке (0xFF, т.е. последний), нужно получить его символическое представление (в win-1251 - 'я', в MacRoman - 'ˇ').
Записан

Изучением 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
SABROG
Гость
« Ответ #5 : Апрель 19, 2011, 12:04 »

символическое представление (в win-1251 - 'я', в MacRoman - 'ˇ').

Имеется ввиду изображение глифа символа? Т.е. для символа F0 маковской кодировки тебе нужно изображение яблока?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Апрель 19, 2011, 12:14 »

да (а в 1251 F0 - это 'р').

вообще смысл в том, чтобы записать корректный символ в имя файла.
Записан

Изучением 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
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Апрель 20, 2011, 10:33 »

провел пару тестов и выяснил интересную вещь: по умолчанию Qt выставляет Latin-1 (или UTF-8), а не системную кодировку Грустный

следующий код на винде и на маке дал абсолютно одинаковый результат:
Код
C++ (Qt)
char c = 0xFF;
QTextCodec *cstr = QTextCodec::codecForCStrings(), *loc = QTextCodec::codecForLocale();
cout << "locale: " << (loc ? loc->name().constData() : "fail") << "\n";
cout << "0xFF: '" << qPrintable(QString::fromAscii(&c)) << "'; cstr: " << (cstr ? cstr->name().constData() : "fail") << "\n";
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("MacRoman"));
cout << "0xFF: '" << qPrintable(QString::fromAscii(&c)) << "'; cstr: " << QTextCodec::codecForCStrings()->name().constData() << "\n";
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("windows-1251"));
cout << "0xFF: '" << qPrintable(QString::fromAscii(&c)) << "'; cstr: " << QTextCodec::codecForCStrings()->name().constData() << "\n";
cout.flush();
Цитата: output
locale: System
0xFF: 'ÿ'; cstr: fail
0xFF: 'ˇ'; cstr: Apple Roman
0xFF: 'я'; cstr: windows-1251

получается без if, QLocale и #ifdef не обойтись?
вот нашел одну переписку, которая дает положительный ответ на предыдущий вопрос... http://lists.trolltech.com/qt-interest/2007-03/thread01152-1.html

з.ы. про qDebug() знаю, но вспомнил о нем только сейчас Улыбающийся
« Последнее редактирование: Апрель 20, 2011, 11:17 от kambala » Записан

Изучением 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
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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