LINUX.ORG.RU

как UTF-8 кодирует так много языков


0

0

Это, наверное, глупый вопрос, но он меня интересует давно - Если кодировка UTF-8 использует только 8 бит для кодирования символа, то как с помощью этой кодировки может быть представлено так много языков, в ней уж явно больше 256 символов :)

читаем педивикию

Текст, состоящий только из символов Юникода с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байт (реально только до 4 байт, поскольку использование кодов больше 221 не планируется), в которых первый байт всегда имеет вид 11xxxxxx, а остальные — 10xxxxxx.

Ingwar ★★★★★
()
Ответ на: комментарий от Graduate

>UTF-16 и больше, если UTF-8

вероятно, разница в том, что UTF-8 - кодировка с плавающей разрядностью, а UTF-16 — с фиксированной, емнип

Ingwar ★★★★★
()
Ответ на: комментарий от xcreatepixmap

>Этих 256 символа есть самые лучшие буквы из всех алфавитов. Отборные буквы.

вообще, самая удивительная кодировка — это конечно же кои-8. при отбрасывании последнего(первого?) бита она становилась обычной аски-кодировкой, но при этом не теряла читаемости на русском языке. за счет этого ее можно было передавать по каналам связи без избыточности по сравнению со стандартной аски, а потом на стороне клиента добавлялся дополнительный бит и вуаля!

Ingwar ★★★★★
()
Ответ на: комментарий от Ingwar

Вообще в UTF-16 всё тоже не влазит, там есть суррогатные пары. Т.е. «фиксированность» как бонус несколько теряется.

Deleted
()

Что этот, с позволения сказать, «вопрос» делает в Development?

Led ★★★☆☆
()
Ответ на: комментарий от Deleted

честно говоря, никогда не вникал в смысл суррогатных пар, я так понимаю, что для тех символов, которые лежат за пределами 2^10 добавляют еще два байта и кодировка получается 2-4-байтная (и совсем не фиксированная)?

Ingwar ★★★★★
()
Ответ на: комментарий от xcreatepixmap

она создавалась на основе раскладки яверти, от-туда и читаемость. мало того, на яверти-раскладке была даже возможность сразу в кои8 писать на кверти-клавиатуре! :)

Ingwar ★★★★★
()
Ответ на: комментарий от Ingwar

Что-то вроде этого. Тоже особо вникать не было желания.

Deleted
()
Ответ на: комментарий от Graduate

>А зачем тогда нужны UTF-16 и больше, если UTF-8 со всем прекрасно справляется?

Потому как UTF-16 не тратит битов на то, чтобы указать, что символ из двух байт. Из-за этого диапазон двухбайтных кодов больше, и некоторые символы, которые в UTF-8 влезают только в три байта, в UTF-16 помещаются в два. Например, знаки многих азиатских алфавитов.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Да и потом, действительно, реализация может быть проще. Количество байт уже не от 1 до 4, а строго 2 или два раза по два. Причем весь basic multilingual plane влезает в 2 байта, поэтому суррогатные пары будут появляться в большинстве текстов не так часто.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

>Причем весь basic multilingual plane влезает в 2 байта, поэтому суррогатные пары будут появляться в большинстве текстов не так часто.
Реализация от этого проще не станет.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Можно перенять опыт джавабыдлокодеров, 99% из которых про суррогатные пары даже не слышали (и вообще про UTF-16), что не мешает им писать программы, нормально работающие для подавляющего большинства неазиатских пользователей.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Ну, какбэ под виндами с сурогатными парами проще — их нет. Там используется старый UTF-16, который не предполагает кодирование символов вне BMP. Может и в жабе тоже? Кстати, я где-то и в никсовом коде видел чудную конструкцию, определяющую количество символов в строке как:

size_t chars_count = string_size_in_bytes / sizeof(wchar_t) - 1;

А вообще, ящитаю, обрабатываться строки должны в виде UTF-32, а храниться и передаваться в виде UTF-8. UTF-16 давно уже не нужон, все с ним цацкаются исключительно из соображений поддержки старого кода.

Remington
()
Ответ на: комментарий от Legioner

>Можно перенять опыт джавабыдлокодеров, 99% из которых про суррогатные пары даже не слышали (и вообще про UTF-16), что не мешает им писать программы, нормально работающие для подавляющего большинства неазиатских пользователей.
Ну да. А стандартные линуксовые программы нормально работают для большинства американских пользователей.
http://juick.com/L29Ah/818752
http://juick.com/x3al/918617

x3al ★★★★★
()

тс неосилятор педивикии

$subj

anon_666
()
Ответ на: комментарий от Remington

Может и в жабе тоже?

Нет. Правда у меня такое впечатление, что в первых версиях джавы про это никто не знал, и считали, что 65к символов всем хватит, а потом увидели что не хватит, но уже совместимость ломать поздно, и сделали немножко через одно место, другой причины не вводить char 32-битным изначально я не вижу.

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

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Ну, наши-то красавцы не лучше. Значительная часть моих бывших одногрупников, например, до сих пор считает, что юникод — это такая кодировка в которой один символ занимает два байта и для интернационализации можно выключить голову и просто юзать два байта для символа.

Это с учётом, что среди них есть чуваки, которые аутсорсят корейские проекты, например.

Remington
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.