Зачем нужно кодировать символы Юникода через UTF и т. Д.?Почему мы не можем просто хранить их как двоичные точки кода? - PullRequest
1 голос
/ 18 сентября 2010

Юникод просто присваивает целое число каждому символу. UTF-8 или другие используются для кодирования этих целых чисел («кодовых точек») в последовательность байтов, которые должны храниться в памяти. Мой вопрос заключается в том, почему мы не можем просто сохранить символ как двоичное представление его значения Unicode («кодовая точка»)? Следовательно, некоторые языки имеют символы, для представления которых требуется несколько байтов. Разве не проще хранить их как двоичный код их кодовых точек?

Ответы [ 3 ]

2 голосов
/ 18 сентября 2010

Да, мы можем, и это UTF-32.

Проблема в том, что UTF-32 тратит много места. Если текст содержит много текста на европейском / иврите / арабском языке, для UTF-8 требуется всего 1–2 байта на кодовую точку, а для UTF-32 - 4 байта на кодовую точку.

Если мы сохраним целочисленное значение как переменный размер, например 0 ~ 255 используют 1 байт, 256 ~ 65535 используют 2 байта и т. Д., У нас будет проблема неоднозначности, например, 5a 5a должен представлять "ZZ" или "& # x5a5a;"? По сути, решением является то, что мы назвали UTF-8 - мы используем некоторые специальные биты, чтобы указать длину последовательности байтов, чтобы дать уникальный результат декодирования.

1 голос
/ 18 сентября 2010

Как именно вы сохраните эти кодовые точки?Некоторые кодовые точки умещаются в один байт, некоторым требуется 3 байта.Будете ли вы использовать 4 байта на каждую кодовую точку?Когда вы смотрите на поток байтов, как вы узнаете, где заканчивается одна кодовая точка, а другая начинается?UTF-8 (и другие кодировки) дает вам ответ на этот вопрос.

0 голосов
/ 18 сентября 2010

Во-первых, есть способ сохранить их как необработанные кодовые точки.Это UTF-32 или UCS-4.Каждый символ будет всегда иметь длину четыре байта и хранить каждую кодовую точку без изменений.

Однако причины использования других, таких как UTF-8, включают:

  • ASCII-совместимость: файлы, содержащие толькоU + 0000 - U + 007f вообще не нужно изменять
  • Эффективность размера: UTF-8 обычно заканчивается в гораздо меньших файлах
...