LINUX.ORG.RU

Маленький вопрос по UTF-8..


0

0

Вот есть например переменная на Cи записанная в кодировке UTF-8:
wchar_t w = L'Ъ';

Если это скомпилировать, потом заглянуть туда в память, то там будет последовательность "2F 04". Но если этот же символ записать в файл (кодировка UTF-8) и сделать hexdump, то можно будет увидеть "D0 AF". Объясните пожалуйста вкратце, как это так преобразовалось?

//нет времени изучать документацию по юникоду

http://ru.wikipedia.org/wiki/UTF-8, таблица после строки «Символы UTF-8 получаются из Unicode следующим образом:».

зы: U+042F ([2F 04]/[D0 AF]) это совсем не «Ъ», это «Я» ;)

arsi ★★★★★
()

Представление wchar_t в памяти зависит от платформы. В твоем случае это скорее всего символ 'Я' (UTF-16, little-endian)

mannaz
()

кодировка wchar_t совсем не UTF-8, а UTF-32

> Объясните пожалуйста вкратце, как это так преобразовалось?

компилятор при компиляции преобразовал текст из кодировки исходного кода UTF-8 в кодировку wchar_t UTF-32 и поместил его в w

по теме:

-fexec-charset=charset Set the execution character set, used for string and character constants. The default is UTF-8. charset can be any encoding supported by the system's iconv library routine.

-fwide-exec-charset=charset Set the wide execution character set, used for wide string and character constants. The default is UTF-32 or UTF-16, whichever corresponds to the width of wchar_t. As with -fexec-charset, charset can be any encoding supported by the system's iconv library routine; however, you will have problems with encodings that do not fit exactly in wchar_t.

-finput-charset=charset Set the input character set, used for translation from the character set of the input file to the source character set used by GCC. If the locale does not specify, or GCC cannot get this information from the locale, the default is UTF-8. This can be overridden by either the locale or this command line option. Currently the command line option takes precedence if there's a conflict. charset can be any encoding supported by the system's iconv library routine.

anonymous
()

> //нет времени изучать документацию по юникоду

ну и дура.

anonymous
()

Всё ясно. Спасибо!

anterior
() автор топика

wchar_t лучше не использовать, на компилятор завязываемся в этом случае. Лучше char * в utf-8 + какая-нибудь либа, например glib.

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.