То, как иметь дело с Unicode, представляет в виде строки в C/C++ межплатформенным дружественным способом?

На платформах, отличающихся, чем Windows, Вы могли легко использовать char * строки и рассматривают их как UTF-8.

Проблема состоит в том, что в Windows Вы обязаны принимать и отправлять сообщения с помощью wchar* строки (W). При использовании функций ANSI (A), Вы не будете поддерживать Unicode.

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

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

Тип строк Вам, возможно, понадобится: std::string, std::wstring, std::tstring,char *,wchat_t *, TCHAR*, CString (ATL один).

Проблемы можно встретиться:

  • cout/cerr/cin и их варианты Unicode wcout,wcerr,wcin
  • все переименованные широкие строковые функции и их макросы TCHAR - как strcmp, wcscmp и _tcscmp.
  • постоянные строки в коде, с TCHAR необходимо будет заполнить код _T() макросы.

Какой подход Вы видите как являющийся лучшим? (примеры приветствуются),

Лично я пошел бы для a std::tstring приблизьтесь, но я хотел бы видеть, как сделает к преобразованиям, где они необходимы.

7
задан sorin 27 April 2010 в 16:19
поделиться

3 ответа

Вы можете сохранить все свои строки в кодировке UTF-8 и просто преобразовать их в UTF-16 перед взаимодействием с WIn32 API. Взгляните на библиотеку UTF8-CPP для некоторых простых в использовании функций преобразования

1
ответ дан 7 December 2019 в 12:17
поделиться

Если вы пишете переносимый код:

1st Никогда не используйте wchar_t , он непереносим, ​​и его кодировка плохо определена между платформами (utf-16 windows / utf-32 все остальные).

Никогда не используйте TChar, используйте простой std :: string в кодировке UTF-8.

При работе с Win32 API, поврежденным мозгом, просто преобразуйте строку UTF-8 в UTF-16 перед ее вызовом.

См. https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful , а также о том, как проект Windows принимает UTF-8 в качестве основной кодировки.

1
ответ дан 7 December 2019 в 12:17
поделиться

Я могу только предложить вам проверить эту библиотеку: http://cppcms.sourceforge.net/boost_locale/docs/
Это может помочь, пока что это кандидат на повышение, но я верю, что он справится.

3
ответ дан 7 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: