Почему в Юникоде есть повторяющиеся символы? - PullRequest
5 голосов
/ 16 ноября 2009

Я вижу несколько повторяющихся символов в Юникод . Например, символ «C» может быть представлен кодовыми точками U + 0043 и U + 0421. Почему это так?

Ответы [ 5 ]

20 голосов
/ 16 ноября 2009

Как уже отмечали другие, ваша главная ошибка - путаница латинского и кириллического алфавита и некоторых глифов в нем (а именно: C ( U + 0043 LATIN CAPITAL LETTER C ) и С ( U + 0421 ПИСЬМО КИРИЛЛИЧЕСКОГО КАПИТАЛА ES )). Есть много таких пар символов, которые похожи друг на друга, но это разные символы. Например, вы найдете много среди латинского, греческого и кириллического алфавита. Однако в большинстве случаев они работают только в верхнем или нижнем регистре.

Однако являются на самом деле дубликатами, иногда намеренно. Например, весь (ASCII) латинский алфавит представлен дважды в блоке Unicode «Полуширинные и Полноширинные формы» между U + FF00 и U + FFEF. Однако есть и другие подобные примеры, особенно в разделе математического алфавита на плоскости 1, где присутствуют еще три или четыре латинских алфавита.

Есть и другие вещи, которые на самом деле имеют один и тот же символ, но в разных точках кода. Например, есть µ ( U + 00B5 MICRO SIGN ) и µ ( U + 03BC ГРЕЧЕСКОЕ МАЛЕНЬКОЕ ПИСЬМО MU ). Они обычно связаны разложением .

Unicode имеет дело с абстрактным понятием под названием кодовая точка . Кодовая точка однозначно определяет символ и его сценарий или группу. Он говорит ничего о том, как будет отображаться соответствующий глиф в шрифте (который уже может сильно отличаться для латыни). Он также не определяет, как эта кодовая точка представлена ​​в файле или памяти (то есть в виде последовательности байтов). Это работа для одного из форматов преобразования Unicode .

В чем причина иметь похожий символ на двух языках с разными кодами?

Основные пункты Unicode здесь:

  • Совместимость с любой ранее существующей кодировкой символов. Это должно гарантировать, что для каждого символа, использованного в кодировке, существует однозначное сопоставление с прямым эквивалентом в качестве кодовой точки Unicode.
  • Достоверно и точно представляет каждый сценарий, который используется в настоящее время, а затем расширен на другие сценарии, которые использовались и должны храниться в компьютерных системах.

Таким образом, существует очень сильный стимул хранить отдельные сценарии и , а не пытаться сопоставлять персонажей в соответствии с их внешним видом. Внешний вид может быть сложно в любом случае. Возьмем, к примеру, кириллицу «т», которая здесь выглядит как заглавная латинская буква «Т». Тем не менее, обычный способ визуализации отображается курсивом: 'т' выглядит как строчная латинская буква 'm'. Вы действительно не хотите отображать таких персонажей по внешнему виду.

9 голосов
/ 16 ноября 2009

Если вы посмотрите на кодовую диаграмму от U + 0400 до U + 04FF , то обнаружите, что U + 0421 - это буква кириллицы с заглавной буквы "es". Может выглядеть как латинская буква C, но это другой логический символ.

8 голосов
/ 16 ноября 2009

Буквы выглядят одинаково, но очень разные. U + 0043 - латинская буква C, а U + 0421 - кириллица С (что соответствует букве S в латинском алфавите).

Из-за их несвязанного значения отдельные кодовые точки требуются для предотвращения ужасно контекстно-зависимых алгоритмов обработки и сортировки - вам внезапно придется угадывать, с каким языком вы имели дело.

7 голосов
/ 16 ноября 2009

По той же причине, что 0 и O выглядят одинаково (в большинстве шрифтов с одним интервалом), но кодируются по-разному - они означают разные вещи.

2 голосов
/ 16 ноября 2009

U+0043 - латинское представление C, в то время как U+0421 - кириллица, что означает, что они на самом деле не являются одной и той же буквой, даже если они могут выглядеть одинаково.

...