На платформах, отличающихся, чем 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
strcmp
, wcscmp
и _tcscmp
. _T()
макросы.Какой подход Вы видите как являющийся лучшим? (примеры приветствуются),
Лично я пошел бы для a std::tstring
приблизьтесь, но я хотел бы видеть, как сделает к преобразованиям, где они необходимы.
Вы можете сохранить все свои строки в кодировке UTF-8 и просто преобразовать их в UTF-16 перед взаимодействием с WIn32 API. Взгляните на библиотеку UTF8-CPP для некоторых простых в использовании функций преобразования
Если вы пишете переносимый код:
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 в качестве основной кодировки.
Я могу только предложить вам проверить эту библиотеку: http://cppcms.sourceforge.net/boost_locale/docs/
Это может помочь, пока что это кандидат на повышение, но я верю, что он справится.