Подтвердить что ты не робот

Unicode - обычно работает с ним в С++

Предположим, что у нас есть произвольная строка, s.

s обладает свойством быть от любой точки мира. Люди из США, Японии, Кореи, России, Китая и Греции все время пишут. К счастью, у нас нет путешественников во времени, которые используют Linear A.

Для обсуждения предположим, что мы хотим выполнять строковые операции, такие как:

  • обратное
  • Длина
  • капитализировать
  • строчными
  • индекс в

и только потому, что это для обсуждения, позвольте предположить, что мы хотим сами написать эти процедуры (вместо того, чтобы хватать библиотеку), и у нас нет никакого устаревшего программного обеспечения для поддержки.

Существует 3 стандарта для Unicode: utf-8, utf-16 и utf-32, каждый из которых имеет плюсы и минусы. Но позвольте сказать, что я немного глуп, и я хочу, чтобы один Юникод правил для них всех (потому что трудно динамически адаптировать библиотеку для 3 различных типов строковых кодировок, которые сильно скрывают отличие от пользователя API).

  • Какая кодировка является наиболее общей?
  • Какая кодировка поддерживается wchar_t?
  • Какая кодировка поддерживается STL?
  • Являются ли эти кодировки полностью (или вовсе не пустыми)?

-

Цель этого вопроса - просвещать себя и других в полезной и полезной информации для Unicode: чтение RFC прекрасно, но есть "стек" информации, относящейся к компиляторам, языкам и операционным системам, которые RFC не используют но важно знать, как использовать Unicode в реальном приложении.

4b9b3361

Ответ 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 может быть хорошей отправной точкой.