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

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

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

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

2 ответа

Решение

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

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

для каждой кодовой точки, представленной строкой в ​​кодировке UTF-16:
    если кодовая точка находится в диапазоне [0,0x7F]:
       испускать кодовую точку, приведенную к символу
    еще:
       выведите "\u", за которым следуют шестнадцатеричные цифры, представляющие кодовую точку

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

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

Другие вопросы по тегам