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

UTF8 против UTF16 против char * в сравнении с чем? Кто-то объясняет мне этот беспорядок!

Мне удалось в основном игнорировать все эти многобайтовые персонажи, но теперь мне нужно сделать некоторые работы пользовательского интерфейса, и я знаю, что мое невежество в этой области будет догонять меня! Может ли кто-нибудь объяснить в нескольких абзацах или меньше, что мне нужно знать, чтобы я мог локализовать свои приложения? Какие типы я должен использовать (я использую как .Net, так и C/С++, и мне нужен этот ответ для Unix и Windows).

4b9b3361

Ответ 1

Ознакомьтесь с Joel Spolsky Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборах символов (без отговорок!)

EDIT 20140523. Также смотрите Символы, символы и чудо Unicode. Том Скотт на YouTube - это всего лишь десять минут, и замечательное объяснение блестящего "взлома", которое является UTF-8

Ответ 2

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

UTF8 (UCS) использует от 1 до 4 байтов для каждого символа. Wikipedia дает хорошее изложение того, как работает многобайтная работа:

  • Самый старший бит однобайтового символа всегда равен 0.
  • Наиболее значимые биты первого байта многобайтовой последовательности определить длину последовательности. Эти наиболее значимые биты составляют 110 для двухбайтовых последовательностей; 1110 для трехбайтовые последовательности и т.д.
  • Остальные байты в многобайтовой последовательности имеют 10 в качестве двух наиболее Значительные бит.
  • Поток UTF-8 не содержит ни байта FE, ни FF. Это гарантирует, что Поток UTF-8 никогда не выглядит как UTF-16 поток, начинающийся с U + FEFF (Знак байтового порядка)

На странице также показано большое сравнение преимуществ и недостатков каждого типа кодировки символов.

UTF16 (UCS2)

Использует 2 байта по 4 байта для каждого символа.

UTF32 (UCS4)

для каждого символа всегда используется 4 байта.

char означает только байт данных и не является фактической кодировкой. Он не аналогичен UTF8/UTF16/ascii. Указатель char * может ссылаться на любой тип данных и любую кодировку.

STL:

Оба stl std:: wstring и std::string не предназначены для кодировки переменной длины, такие как UTF-8 и UTF-16.

Как реализовать:

Взгляните на библиотеку iconv. iconv - мощная библиотека преобразования кодировки символов, используемая такими проектами, как libxml (XML-парсер Gnome)

Другие большие ресурсы для кодировки символов:

Ответ 3

Полученная мудрость предполагает, что статья Спольского пропускает пару важных моментов.

Эта статья рекомендуется как более полная: Стандарт Unicode®: Техническое введение

Эта статья также представляет собой хорошее введение: Основы Unicode

Последнее, в частности, дает обзор форм и схем кодирования символов для Unicode.

Ответ 4

Различные стандарты UTF - это способы кодирования "кодовых точек". Кодовой точкой является индекс в набор символов char Unicode.

Другая кодировка - это UCS2, которая всегда 16 бит и, следовательно, не поддерживает полный диапазон Unicode.

Полезно знать, что один код не равен одному символу. Например, символ, такой как å, может быть представлен как в виде кодовой точки, так и в виде двух кодовых точек один для a и один для кольца.

Сравнение двух строк Юникода, таким образом, требует нормализации, чтобы получить каноническое представление перед сравнением.

Ответ 5

Существует также проблема с шрифтами. Существует два способа обработки шрифтов. Либо вы используете гигантский шрифт с глифами для всех символов Unicode, которые вам нужны (я думаю, что последние версии Windows поставляются с одним или двумя такими шрифтами). Или вы используете библиотеку som, способную комбинировать глифы из разных шрифтов, предназначенных для подмножеств стандарта Unicode.