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

StackOverflow https://stackoverflow.com/questions/172133

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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 байта для каждого символа.

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

СТЛ:

Как Std :: Wstring, так и Std :: Std :: Std :: не предназначены для кодировки символов переменной длины, такие как UTF-8 и UTF-16.

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

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

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

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

Эта статья рекомендуется как более полная: Юникод & # 174; Стандарт: Техническое введение

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top