Конвертировать wchar_t * в строку UTF-16 - PullRequest
5 голосов
/ 14 марта 2012

Мне нужен код на 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)?

Ответы [ 5 ]

8 голосов
/ 14 марта 2012

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

5 голосов
/ 14 марта 2012

C ++ 11 std::codecvt_utf16 должно работать, я думаю.

std :: codecvt_utf16 - это фасет std :: codecvt, который инкапсулирует преобразование между строкой байтов в кодировке UTF-16 и строкой символов UCS2 или UCS4 (в зависимости от типа Elem).

См. Это: http://en.cppreference.com/w/cpp/locale/codecvt_utf16

3 голосов
/ 22 марта 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

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

2 голосов
/ 14 марта 2012

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

0 голосов
/ 14 марта 2012

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

...