Unicode - обычно работающий с ним в C++

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

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

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

  • реверс
  • длина
  • использовать для своей выгоды
  • нижний регистр
  • индекс в

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

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

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

--

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

16
задан Paul Nathan 24 February 2010 в 17:15
поделиться

4 ответа

  1. Какая кодировка является наиболее общей
    Вероятно, UTF-32, хотя все три формата могут хранить любой символ. UTF-32 имеет свойство, заключающееся в том, что каждый символ может быть закодирован в одной кодовой точке.

  2. Какая кодировка поддерживается wchar_t
    Нет. Это определено реализацией. На большинстве платформ Windows это UTF-16, на большинстве платформ Unix - UTF-32.

  3. Какая кодировка поддерживается STL
    Нет на самом деле . STL может хранить любой тип символа по вашему желанию. Просто используйте шаблон std :: basic_string с типом, достаточно большим, чтобы вместить вашу кодовую точку. Однако большинство операций (например, std :: reverse ) не знают о какой-либо кодировке Unicode.

  4. Все ли эти кодировки (или не завершаются) завершаются нулем?
    Нет. Null - допустимое значение в любой из этих кодировок. Технически NULL также является допустимым символом в простом ASCII. Прерывание NULL - это вещь C, а не кодировка.

Выбор того, как это сделать, во многом зависит от вашей платформы. Если вы работаете в Windows, используйте строки UTF-16 и wchar_t, потому что это то, что Windows API использует для поддержки юникода. Я не совсем уверен, что лучше всего подходит для платформ UNIX, но я знаю, что большинство из них используют UTF-8.

9
ответ дан 30 November 2019 в 22:37
поделиться

Взгляните на библиотеку с открытым исходным кодом ICU , особенно на раздел Документы и статьи . Это обширная библиотека, занимающаяся всевозможными странностями юникода.

5
ответ дан 30 November 2019 в 22:37
поделиться

В ответ на ваш последний пункт, UTF-8 гарантированно не будет иметь байтов NULL в кодировке любого символа (кроме самого NULL, конечно). В результате многие функции, которые работают со строками с завершающим NULL, также работают со строками в кодировке UTF-8.

2
ответ дан 30 November 2019 в 22:37
поделиться

Определите «настоящее приложение»:)

Серьезно, решение действительно во многом зависит от типа программного обеспечения, которое вы разрабатываете.Если ваша целевая платформа - Win32 API (с оболочками или без них, такими как MFC, WTL и т. Д.), Вы, вероятно, захотите использовать типы wstring с текстом в кодировке UTF-16. Это просто потому, что все Win32 API внутренне в любом случае используют эту кодировку.

С другой стороны, если ваш вывод похож на XML / HTML и / или должен быть доставлен через Интернет, UTF-8 в значительной степени является стандартом - он обычно хорошо передается через протоколы, которые делают предположения о символах, имеющих 8 биты.

Что касается UTF-32, я не могу придумать единственной причины для его использования, если только вам не требуется сопоставление 1: 1 между кодовыми единицами и кодовыми точками (это все еще не означает сопоставление 1: 1 между кодовыми модулями и символами. !).

Для получения дополнительной информации обязательно посетите Unicode.org. Этот FAQ может стать хорошей отправной точкой.

1
ответ дан 30 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: