В чем преимущество выбора кодировки ASCII перед UTF-8?

91

Все символы в ASCII могут быть закодированы с использованием UTF-8 без увеличения объема памяти (для обоих требуется один байт памяти).

UTF-8 имеет дополнительное преимущество поддержки символов помимо «ASCII-символов». Если это так, почему мы когда-нибудь выберем кодировку ASCII вместо UTF-8?

Есть ли вариант использования, когда мы выберем ASCII вместо UTF-8?

Pacerier
источник
9
Для поддержки устаревших вещей ...
fretje
9
я имею в виду UTF8 является legacily поддержкой ASCII тоже. так что даже если вам нужно поддерживать устаревшие вещи, UTF8 будет работать нормально, никаких других изменений не требуется.
Pacerier
3
Может быть, вам нужно взаимодействовать с системой, которая упаковывает 8 символов ASCII в 7 байтов? Люди делали сумасшедшие вещи, чтобы соответствовать вещам.
Донал Феллоуз
4
Назовите меня сумасшедшим, но я бы сказал, безопасность и стабильность. Набор символов без многобайтовых последовательностей намного сложнее сломать. Не поймите меня неправильно, когда поддержка человеческого языка важна, ASCII не будет ее сокращать. Но если вы просто занимаетесь базовым программированием и можете втиснуть себя в родной язык, для которого были написаны компилятор и операционная система, зачем добавлять сложность? @Donal Fellows. Последнее, что я проверял ... ASCII составляет 7 байтов. (что-нибудь с этим дополнительным битом просто не ASCII и вызывает проблемы)
ebyrob
2
@ebyrob Я думаю, что Donal Fellows означает битовую упаковку 8 символов ascii в 7 байтов, поскольку каждый символ использует 7 бит каждый ... 8 * 7 = 56 бит = 7 байтов. Это означало бы специальную функцию кодирования и декодирования, просто чтобы сохранить 1 байт памяти из каждых 8.
dodgy_coder

Ответы:

83

В некоторых случаях это может ускорить доступ к отдельным персонажам. Представьте себе строку, str='ABC'закодированную в UTF8 и в ASCII (и при условии, что язык / компилятор / база данных знает о кодировании)

Чтобы получить доступ к третьему Cсимволу ( ) из этой строки, используя оператор доступа к массиву, который присутствует во многих языках программирования, вы должны сделать что-то вроде этого c = str[2].

Теперь, если строка в кодировке ASCII, все, что нам нужно сделать, это извлечь третий байт из строки.

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

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

MCHL
источник
3
Если база данных не хранит как «количество символов», так и «количество байтов», то я бы сказал, что у нее есть некоторые проблемы ...
Дин Хардинг,
1
Т.Б. Я не знаю ни одной базы данных, которая бы
хранила
@Mchl: как вы думаете, база данных знает, когда она достигла конца строки?
Кевин Клайн
1
Обычно достигая 0x00 или 0x0000
Mchl
4
@DeanHarding Как подсчет символов говорит вам, где начинается второй символ? Или база данных должна содержать индекс для каждого смещения символа? Примечание: это не просто 2 символа, но может быть до 4 (если не 6) stackoverflow.com/questions/9533258/… . (Я думаю, что только у utf-16 были действительно длинные мерзости, которые могли разрушить вашу систему)
ebyrob
7

Если вы собираетесь использовать только подмножество UTF-8 US-ASCII (или ISO 646), то ни у одного из них нет реального преимущества; на самом деле все закодировано одинаково.

Если вы собираетесь выйти за пределы набора символов US-ASCII и использовать (например) символы с акцентами, умлаутами и т. Д., Которые используются в типичных западноевропейских языках, то есть разница - большинство из них все еще могут быть закодирован одним байтом в ISO 8859, но при кодировании в UTF-8 потребуется два или более байтов. Есть, конечно, и недостатки: ISO 8859 требует использования некоторых внешних средств для определения используемой кодировки, и он поддерживает только одноиз этих языков одновременно. Например, вы можете кодировать все символы алфавита кириллицы (русский, белорусский и т. Д.), Используя только один байт, но если вам нужно / нужно смешивать их с французскими или испанскими символами (кроме тех, что в US-ASCII) / Подмножество ISO 646) вам в значительной степени не повезло - вы должны полностью изменить наборы символов, чтобы сделать это.

ISO 8859 действительно полезен только для европейских алфавитов. Для поддержки большинства алфавитов, используемых в большинстве алфавитов на китайском, японском, корейском, арабском и т. Д., Вам необходимо использовать совершенно другую кодировку. Некоторые из них (например, Shift JIS для японского) - абсолютная боль, с которой приходится иметь дело. Если есть шанс, что вы когда-нибудь захотите их поддержать, я бы посоветовал использовать Unicode на всякий случай.

Джерри Гроб
источник
5

ANSI может быть многим, в большинстве случаев это 8-битные наборы символов (например, кодовая страница 1252 в Windows).

Возможно, вы думали об ASCII, который является 7-битным и подходящим подмножеством UTF-8. Т.е. любой действительный поток ASCII также является допустимым потоком UTF-8.

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


источник
да, я говорю о 7-битном наборе ASCII. Можете ли вы подумать об одном преимуществе, которое нам когда-либо понадобится, чтобы сохранить что-то как ascii вместо utf-8? (поскольку 7-битный
файл
1
Если у вас есть символы больше, чем уникодное значение 127, они не могут быть сохранены в ASCII.
1
@Pacerier: любая строка ASCII является строкой UTF-8 , поэтому нет никакой разницы . Процедура кодирования может быть быстрее в зависимости от строкового представления используемой вами платформы, хотя я не ожидаю значительного ускорения, в то время как у вас будет значительная потеря гибкости.
back2dos
@ Именно поэтому я спрашиваю, имеет ли сохранение как ASCII какие-либо преимущества вообще
Pacerier
5
@Pacerier, если вы сохраняете XML как ASCII, вам нужно использовать, например, & # 160; для неразрушимого пространства. Это более наполненно, но делает ваши данные более устойчивыми к ошибкам кодирования ISO-Latin-1 и UTF-8. Это то, что мы делаем, поскольку наша базовая платформа делает много невидимой магии с персонажами. Пребывание в ASCII делает наши данные более надежными.
3

Да, есть еще случаи использования ASCII: форматы файлов и сетевые протоколы . В частности, для использования где:

  • У вас есть данные, которые генерируются и используются компьютерными программами, никогда не представляются конечным пользователям;
  • Но это полезно для программистов, чтобы иметь возможность читать, для простоты разработки и отладки.

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

Пара примеров:

  • HTTP - это сетевой протокол, определенный в виде последовательностей октетов, но очень полезно (по крайней мере, для англоговорящих программистов), чтобы они соответствовали кодировке ASCII таких слов, как «GET», «POST», «Accept-Language» и скоро.
  • Эти типы порций в формате PNG изображений состоят из четырех октетов, но это удобно , если вы программируете кодер PNG или декодер , который IDATозначает «данные изображения», а PLTEзначит «палитра».

Конечно, вы должны быть осторожны, чтобы данные действительно не были представлены конечным пользователям, потому что если они в конечном итоге становятся видимыми (как это произошло в случае URL-адресов), то пользователи по праву ожидают, что эти данные будут на языке, который они могут читать.

Гарет Рис
источник
Хорошо сказано. Немного иронично, что HTTP, протокол, который передает самый юникод на планете, нуждается только в поддержке ASCII. (На самом деле, я полагаю, что то же самое касается TCP и IP, двоичной поддержки, поддержки ASCII ... это все, что вам нужно на этом уровне стека)
ebyrob
2

Прежде всего: ваш заголовок использует / d ANSI, а в тексте вы ссылаетесь на ASCII. Обратите внимание, что ANSI не равен ASCII. ANSI включает в себя набор ASCII. Но набор ASCII ограничен первыми 128 числовыми значениями (0 - 127).

Если все ваши данные ограничены ASCII (7-разрядным), не имеет значения, используете ли вы UTF-8, ANSI или ASCII, поскольку и ANSI, и UTF-8 содержат полный набор ASCII. Другими словами: числовые значения от 0 до 127 включительно представляют абсолютно одинаковые символы в ASCII, ANSI и UTF-8.

Если вам нужны символы вне набора ASCII, вам нужно выбрать кодировку. Вы можете использовать ANSI, но тогда вы столкнетесь с проблемами всех различных кодовых страниц. Создать файл на машине A и прочитать его на машине B может / будет производить смешно выглядящие тексты, если эти машины настроены на использование разных кодовых страниц, просто потому, что числовое значение nnn представляет разные символы в этих кодовых страницах.

Этот «ад кодовой страницы» является причиной, по которой был определен стандарт Unicode . UTF-8 - это всего лишь единая кодировка этого стандарта, их гораздо больше. UTF-16 является наиболее широко используемым, поскольку он является родной кодировкой для Windows.

Итак, если вам нужно поддерживать что-либо, кроме 128 символов набора ASCII, мой совет - использовать UTF-8 . Таким образом, это не имеет значения, и вам не нужно беспокоиться о том, с какой кодовой страницей ваши пользователи настроили свои системы.

Марьян Венема
источник
если мне не нужно поддерживать более 128 символов, в чем преимущество выбора кодировки ACSII по сравнению с кодировкой UTF8?
Пейсер
Кроме того, чтобы ограничить себя этими 128 символами? Немного. UTF-8 был специально разработан для обслуживания ASCII и большинства западных языков, которым «только» нужен ANSI. Вы обнаружите, что UTF-8 будет кодировать только относительно небольшое количество старших символов ANSI с более чем одним байтом. Есть причина, по которой большинство HTML-страниц используют UTF-8 по умолчанию ...
Marjan Venema
1
@Pacerier, если вам не нужно кодирование выше 127, выбор ASCII может оказаться полезным, когда вы используете какой-то API для кодирования / декодирования, потому что UTF требует дополнительной проверки битов, чтобы считать дополнительные байты одним и тем же символом, он может потребовать дополнительных вычислений, а не чистый ASCII, который просто читает 8 бит без проверки. Но я рекомендую вам использовать ASCII только в том случае, если вам действительно нужен высокий уровень оптимизации в больших (больших и больших) вычислениях, и вы знаете, что делаете в этой оптимизации. Если нет, просто используйте UTF-8.
Лучано