Как работать со строками Unicode в C / C ++ кросс-платформенным способом? - PullRequest
7 голосов
/ 27 апреля 2010

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

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

Поэтому, если вы хотите написать действительно переносимое приложение, вам нужно скомпилировать его как Unicode в Windows.

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

Тип строк, которые могут вам понадобиться: std::string, std::wstring, std::tstring, char *, wchat_t *, TCHAR*, CString (ATL one).

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 27 апреля 2010

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

1 голос
/ 28 апреля 2010

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

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 голос
/ 27 апреля 2010

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

...