Преобразование wchar_t* в строку UTF-16

Мне нужен код на C++ для преобразования строки, заданной в wchar_t*, в строку UTF-16. Он должен работать как в Windows, так и в Linux. Я просмотрел много веб-страниц во время поиска, но тема мне так и не ясна.

Как я понимаю нужно:

  1. Вызовите setlocale с кодировкой LC_TYPE и UTF-16.
  2. Используйте wcstombs для преобразования wchar_t в строку UTF-16.
  3. Позвоните setlocale, чтобы восстановить предыдущую локаль.

Знаете ли вы, как я могу преобразовать wchar_t* в UTF-16 переносимым способом (Windows и Linux)?


person Andrei Baskakov    schedule 14.03.2012    source источник
comment
Возможно, мои вопросы по кодированию #1, #2, #3 могут быть полезны.   -  person Kerrek SB    schedule 14.03.2012
comment
В каком кодовом наборе находится строка wchar_t? Какой тип вы предполагаете использовать для представления типа символа в строке UTF-16? Это просто преобразование между UTF-32 (в wchar_t) и UTF-16 в uint16_t? Или вы тоже имеете дело с преобразованием кодового набора? Портативность — благородная цель; это не всегда достижимо, к сожалению. Изучите ICU.   -  person Jonathan Leffler    schedule 14.03.2012


Ответы (5)


Для этого в C++03 не существует единого кроссплатформенного метода (не без библиотеки). Отчасти это связано с тем, что wchar_t само по себе не одно и то же на разных платформах. В Windows wchar_t — это 16-битное значение, тогда как на других платформах это часто 32-битное значение. Таким образом, вам понадобятся два разных пути кода, чтобы сделать это.

person Nicol Bolas    schedule 14.03.2012


Вы можете предположить, что wchar_t — это utf-32 в мире, отличном от Windows. Это верно для Linux, Mac OS X и большинства систем *nix (есть очень мало исключений, и в системах, которые вы, вероятно, никогда не коснетесь :-)

А wchar_t — это utf-16 в Windows. Так что в Windows функция преобразования может просто выполнить memcpy :-)

Во всем остальном преобразование алгоритмическое и довольно простое. Таким образом, нет необходимости в причудливой поддержке сторонних библиотек.

Вот основной алгоритм: http://unicode.org/faq/utf_bom.html#utf16. -3

И вы, вероятно, можете найти десяток различных реализаций, если не хотите писать свою собственную :-)

person Mihai Nita    schedule 22.03.2012

Проблема в том, что wchar_t довольно занижено. Вы можете использовать GNU libiconv, чтобы делать то, что хотите. Он принимает специальное имя кодировки "wchar_t" как исходную, так и целевую кодировку. Таким образом, он будет переносим как на Windows, так и на Linux и в другие места, где вы можете предоставить libiconv.

person wilx    schedule 14.03.2012

Компилятор g++ поддерживает wcstombs?

person JTeagle    schedule 14.03.2012
comment
Вы задаете вопрос или констатируете факт? - person Remy Lebeau; 13.10.2015