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