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


91

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

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

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


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, но и как много байтов каждый из них использует.


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.
Лучано
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.