Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Чем кодировка символов Юникода UTF-16 лучше UTF-8, если последняя позволяет кодировать символы в 3 байта, а первая в 4?

Микстурка . Знаток (441), закрыт 4 года назад
Выходит, что UTF-8 более ресурсоемкая
Лучший ответ
Андрей Высший разум (466098) 4 года назад
Ничем не лучше. UTF-16 - атавизм тех времён, когда в Unicode существовала только нулевая плоскость (коды символов 0x0000-0xFFFF) и для записи кодов всех символов хватало двух байт. Тогда UTF-16 казалась удачным выбором и потому эта кодировка оказалась встроена и в Windows, и в Java, и в JavaScript... Вот создатели PHP вовремя одумались и работа над PHP 6 со встроенной UTF-16 была прекращена.

Но с появлением символов с кодами от 0x10000 и больше, стало понятно, что UTF-16 - крайне неудачная кодировка, не имеющая никаких преимуществ ни по скорости, ни по объёму данных. Но отказаться от UTF-16 сейчас уже очень сложно - слишком много кода за эти годы написано.

В UTF-16 символы с кодами 0x0000-0xFFFF всегда занимают 2 байта, а символы с кодами от 0x10000 и больше - 4 байта.

В UTF-8 символы с кодами 0x00-0x7F занимают 1 байт, 0x080-0x7FF - 2 байта, 0x0800-0xFFFF - 3 байта, от 0x10000 и больше - 4 байта. Так что нет, по занимаемому объёму UFT-8 в среднем не хуже, чем UTF-16. Но при этом обработка символов в UTF-8 проще, чем в UTF-16.
Микстурка . Знаток (441) 4 года назад
Но ведь для кодирования символов диапазона 0x0800-0xFFFF, utf-8 будет использовать 3 байта, а utf-16 будет вынуждена использовать 4 байта, т. е символ будет занимать больше места в памяти
Андрей Высший разум (466098) Микстурка . ,А как часто используются символы в диапазоне 0x0800-0xFFFF - по сравнению с диапазоном 0x00-0x7F? Для этих символов UTF-16 будет использовать ДВА байта. Только если код БОЛЬШЕ 0xFFFF - вот тогда 4 байта и в UTF-16, и в UTF-8. Потому, если символы 0x00-0x7F используются чаще, чем 0x0800-0xFFFF, выигрывать в размере будет UTF-8, если реже - UTF-16. Но проблема UTF-16 вовсе не в размере, а в том, что определить длину символа в UTF-16 сложнее, чем в UTF-8, преобразовать код UTF-16 в код символа сложнее, чем UTF-8. Кроме того, потеря одного байта при передаче данных приведёт к полной нечитаемости всего текста в UTF-16 после точки сбоя и нечитаемости всего одного символа в UTF-8.
Остальные ответы
ястреб ворон Мыслитель (7275) 4 года назад
1байт-8бит.
x86=32бита=4байта.
int команда инициализации целочисленных переменных в c равен 4 байтам.
Возможно компьютеру для трансляции команд быстрее использовать utf-8.
Похожие вопросы