Russian Qt Forum

Qt => Общие вопросы => Тема начата: kambala от Апрель 18, 2011, 19:34



Название: корректное преобразование символа в системную кодировку
Отправлено: kambala от Апрель 18, 2011, 19:34
Здравствуйте. Есть ли универсальный способ преобразовать символ в текущую кодировку системы зная его код?

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

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

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


Название: Re: корректное преобразование символа в системную кодировку
Отправлено: SABROG от Апрель 18, 2011, 21:53
зная его код?

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

, но не зная какой из кодов какой кодировке принадлежит?


Название: Re: корректное преобразование символа в системную кодировку
Отправлено: kambala от Апрель 18, 2011, 22:04
нет.

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


Название: Re: корректное преобразование символа в системную кодировку
Отправлено: SABROG от Апрель 19, 2011, 07:58
нет.

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

Т.е. из системной локальной кодировки одного компьютера в системную локальную кодировку другого?


Название: Re: корректное преобразование символа в системную кодировку
Отправлено: kambala от Апрель 19, 2011, 09:30
ну в принципе да.

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


Название: Re: корректное преобразование символа в системную кодировку
Отправлено: SABROG от Апрель 19, 2011, 12:04
символическое представление (в win-1251 - 'я', в MacRoman - 'ˇ').

Имеется ввиду изображение глифа символа? Т.е. для символа F0 маковской кодировки тебе нужно изображение яблока?


Название: Re: корректное преобразование символа в системную кодировку
Отправлено: kambala от Апрель 19, 2011, 12:14
да (а в 1251 F0 - это 'р').

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


Название: Re: корректное преобразование символа в системную кодировку
Отправлено: kambala от Апрель 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() знаю, но вспомнил о нем только сейчас :)