Recommendations
- Первая и самая важная рекомендация: предпочтите кодирование UTF-8 для узких строк — он представляет все поддерживаемые символы Unicode и более удобен для общего использования, чем кодирование, такое как Latin1.
- Помните, что существует много разных культур. Вы можете очень мало говорить о языке пользователя. В его календаре может не быть «января». Может быть невозможно преобразовать строки в целые числа, используя
atoi, потому что они могут вообще не использовать «обычные» цифры 0,9. Вы не можете предположить, что «космические» символы встречаются часто, потому что в китайском языке пространственный символ не разделяет слова. Текст может быть написан справа налево или сверху вниз и так далее.
- Используя форматирование сообщений, постарайтесь предоставить как можно больше контекстной информации. Предпочитает перевод целых предложений на отдельные слова. При переводе словвсегдадобавляйте некоторую контекстную информацию.
Myths
To use Unicode in my application I should use wide strings everywhere.
Unicode не ограничивается широкими строками. И<std::string>, и<std::wstring>могут хранить и обрабатывать текст Unicode. Более того, семантика<std::string>намного чище в мультиплатформенных приложениях, поскольку все строки «Unicode» являются UTF-8. «Широкие» строки могут быть закодированы в «UTF-16» или «UTF-32», в зависимости от платформы, поэтому они могут быть даже менее удобными при работе с Unicode, чем<char>.
UTF-16 is the best encoding to work with.
Существует распространенное предположение, что UTF-16 является лучшим кодированием для хранения информации, поскольку он дает «короткое» представление строк.
На самом деле, это, вероятно, наиболее подверженное ошибкам кодирование для работы. Самой большой проблемой являются кодовые точки, которые лежат за пределами BMP, которые должны быть представлены суррогатными парами. Эти символы очень редки, и многие приложения не тестируются с ними.
Например:
- Qt3 не может работать с персонажами за пределами BMP.
- Редактирование символа с кодовой точкой выше 0xFFFF часто показывает неприятную ошибку: например, чтобы стереть такой символ в Windows Notepad, нужно дважды нажать заднее пространство.
Таким образом, UTF-16 может использоваться для Unicode, на самом деле ICU и многие другие приложения используют UTF-16 в качестве своего внутреннего представления Unicode, но вы должны быть очень осторожны и никогда не принимать однокодовую точку == один-utf16-символ.