Unicode - обычно работает с ним в С++
Предположим, что у нас есть произвольная строка, s.
s обладает свойством быть от любой точки мира. Люди из США, Японии, Кореи, России, Китая и Греции все время пишут. К счастью, у нас нет путешественников во времени, которые используют Linear A.
Для обсуждения предположим, что мы хотим выполнять строковые операции, такие как:
- обратное
- Длина
- капитализировать
- строчными
- индекс в
и только потому, что это для обсуждения, позвольте предположить, что мы хотим сами написать эти процедуры (вместо того, чтобы хватать библиотеку), и у нас нет никакого устаревшего программного обеспечения для поддержки.
Существует 3 стандарта для Unicode: utf-8, utf-16 и utf-32, каждый из которых имеет плюсы и минусы. Но позвольте сказать, что я немного глуп, и я хочу, чтобы один Юникод правил для них всех (потому что трудно динамически адаптировать библиотеку для 3 различных типов строковых кодировок, которые сильно скрывают отличие от пользователя API).
- Какая кодировка является наиболее общей?
- Какая кодировка поддерживается wchar_t?
- Какая кодировка поддерживается STL?
- Являются ли эти кодировки полностью (или вовсе не пустыми)?
-
Цель этого вопроса - просвещать себя и других в полезной и полезной информации для Unicode: чтение RFC прекрасно, но есть "стек" информации, относящейся к компиляторам, языкам и операционным системам, которые RFC не используют но важно знать, как использовать Unicode в реальном приложении.
Ответы
Ответ 1
-
Какая кодировка является наиболее общей
Возможно, UTF-32, хотя все три формата могут хранить любой символ. UTF-32 обладает тем свойством, что каждый символ может быть закодирован в одном кодеге.
-
Какая кодировка поддерживается wchar_t
Никто. Эта реализация определена. На большинстве платформ Windows UTF-16 на большинстве платформ Unix имеет UTF-32.
-
Какая кодировка поддерживается STL
Ничего. STL может хранить любой тип персонажа, который вы хотите. Просто используйте шаблон std::basic_string<t>
с типом, достаточно большим для хранения вашей кодовой точки. Большинство операций (например, std::reverse
) не знают о каком-либо кодировке в Unicode.
-
Являются ли эти кодировки полностью (или вовсе не пустыми)?
Null - это юридическое значение в любом из этих кодировок. Технически, NULL является юридическим символом в простом ASCII. Окончание NULL - вещь C, а не кодировка.
Выбор того, как это сделать, имеет много общего с вашей платформой. Если вы работаете в Windows, используйте строки UTF-16 и wchar_t, потому что это то, что использует API Windows для поддержки Unicode. Я не совсем уверен, что лучший выбор для платформ UNIX, но я знаю, что большинство из них используют UTF-8.
Ответ 2
Посмотрите на библиотеку с открытым исходным кодом ICU, особенно на Документы и документы. Это обширная библиотека, посвященная разным стилям unicode.
Ответ 3
В ответ на вашу окончательную марку UTF-8 гарантированно не имеет NULL-байтов в кодировке любого символа (за исключением, конечно, самого NULL). В результате многие функции, которые работают с строками с завершающим NULL, также работают с закодированными строками UTF-8.
Ответ 4
Определите "реальное приложение":)
Серьезно, решение действительно сильно зависит от того, какое программное обеспечение вы разрабатываете. Если ваша целевая платформа - это Win32 API (с или без оберток, таких как MFC, WTL и т.д.), Вы, вероятно, захотите использовать типы wstring
с текстом, закодированным как UTF-16. Это просто потому, что все API Win32 внутренне использует эту кодировку.
С другой стороны, если ваш вывод похож на XML/HTML и/или должен быть доставлен через Интернет, UTF-8 в значительной степени является стандартом - он обычно хорошо передается через протоколы, которые делают предположения о символах с 8 биты.
Что касается UTF-32, я не могу придумать ни одной причины использовать его, если вам не требуется сопоставление 1:1 между кодовыми единицами и кодовыми точками (это все еще не означает сопоставление 1:1 между кодовыми единицами и символами!).
Для получения дополнительной информации обязательно ознакомьтесь с Unicode.org. Этот FAQ может быть хорошей отправной точкой.