C ++ Unicode UTF-16 кодировка - PullRequest
       32

C ++ Unicode UTF-16 кодировка

3 голосов
/ 21 апреля 2010

У меня есть широкая строка символов L "hao123-- 我 的 上网 主页", и она должна быть закодирована как "hao123 - \ u6211 \ u4E0A \ u7F51 \ u4E3B \ u9875" Мне сказали, что закодированная строка - это специальный формат «% uNNNN» для кодирования кодовых точек Unicode UTF-16. На этом сайте он говорит мне, что JavaScript сбежал. Но я не знаю, как его кодировать с помощью C ++.

Есть ли какая-нибудь библиотека, чтобы заставить это работать? или дайте мне несколько советов.

Спасибо, друзья!

Ответы [ 2 ]

2 голосов
/ 21 апреля 2010

Встраивание юникода в строковые литералы, как правило, не очень хорошая идея и не переносимо; нет никакой гарантии, что wchar_t будет 16 бит и что кодировка будет UTF-16. Хотя это может иметь место в Windows с Microsoft Visual C ++ (конкретная реализация C ++), wchar_t является 32-битным в GCC OS X (другая реализация). Если у вас есть какие-то локализованные строковые константы, лучше использовать файл конфигурации в какой-то конкретной кодировке и интерпретировать их как закодированные в этой кодировке. Библиотека International Components for Unicode (ICU) обеспечивает довольно хорошую поддержку для интерпретации и обработки юникода. Еще одна хорошая библиотека для преобразования (но не интерпретации) форматов кодирования: libiconv .

Редактировать
Возможно, я неверно истолковал ваш вопрос ... если проблема в том, что у вас уже есть строка в UTF-16, и вы хотите преобразовать ее в "unicode-escape ASCII" (то есть строку ASCII, где символы Unicode представлены как «\ u», за которым следует числовое значение символа), затем используйте следующий псевдокод:

for each codepoint represented by the UTF-16 encoded string:
    if the codepoint is in the range [0,0x7F]:
       emit the codepoint casted to a char
    else:
       emit "\u" followed by the hexadecimal digits representing codepoint

Теперь, чтобы получить кодовую точку, существует очень простое правило ... каждый элемент в строке UTF-16 является кодовой точкой, если только он не является частью «суррогатной пары», в этом случае он и элемент после он включает в себя одну кодовую точку. Если это так, то стандарт Unicode определяет процедуру объединения «ведущего суррогата» и «конечного суррогата» в одну кодовую точку. Обратите внимание, что UTF-8 и UTF-16 являются кодировками переменной длины ... кодовая точка требует 32 бита, если не представлена ​​с переменной длиной. В часто задаваемых вопросов Unicode Transformation Format (UTF) объясняется кодирование, а также способы идентификации суррогатных пар и способы их объединения в кодовые точки.

0 голосов
/ 21 апреля 2010

Просто используйте \x вместо \u.

...