UTF8 против UTF16 против char * против чего? Кто-нибудь объяснит мне этот беспорядок! - PullRequest
33 голосов
/ 05 октября 2008

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

Ответы [ 5 ]

76 голосов
/ 05 октября 2008

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

РЕДАКТИРОВАТЬ 20140523 : Кроме того, посмотрите на символы, символы и чудо Юникода Тома Скотта на YouTube - это чуть менее десяти минут и прекрасное объяснение блестящего «хака» UTF-8

25 голосов
/ 05 октября 2008

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

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

  • Самый старший бит однобайтового символа всегда равен 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:

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

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

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

Другие замечательные ресурсы по кодированию символов:

12 голосов
/ 05 октября 2008

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

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

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

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

4 голосов
/ 05 октября 2008

Различные стандарты UTF - это способы кодирования «кодовых точек». Кодовая точка - это индекс в наборе символов Юникода.

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

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

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

1 голос
/ 05 октября 2008

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

...