Яка перевага вибору кодування ASCII над UTF-8?


91

Усі символи в ASCII можна кодувати за допомогою UTF-8 без збільшення сховища (для обох потрібен байт сховища).

UTF-8 має додаткову перевагу підтримки символів, що перевищує "ASCII-символи". Якщо це так, то чому ми колись обиратимемо кодування ASCII через UTF-8?

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


9
Щоб підтримати застарілі речі ...
fretje

9
я маю на увазі, що UTF8 також юридично підтримує ASCII. тож навіть якщо вам доведеться підтримувати застарілі речі, UTF8 буде добре працювати, не потребуючи інших змін.
Pacerier

3
Можливо, вам доведеться взаємодіяти із системою, яка запаковує 8 символів ASCII в 7 байт? Люди робили божевільні речі, щоб вони підходили.
Стипендіати Дональда,

4
Називай мене гайкою, але я б сказав, що безпека та стабільність. Набір символів без багатобайтових послідовностей набагато складніше зламати. Не зрозумійте мене неправильно, коли важлива підтримка людської мови, ASCII не вирішить. Але якщо ви просто займаєтесь базовим програмуванням і можете втиснути себе на рідну мову, для чого були написані компілятор та операційна система, навіщо додавати складність? @Donal стипендіатів. Востаннє я перевірив ... 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
TBH Я не знаю жодної бази, яка б зберігала ...
Mchl,

@Mchl: як ви уявляєте, база даних знає, коли вона досягла кінця рядка?
кевін клайн

1
Зазвичай, досягнувши 0x00 або 0x0000
Mchl

4
@DeanHarding Як ​​підрахунок символів підказує, з чого починається другий символ? Або також база даних повинна містити індекс для кожного зміщення символів? Примітка. Це не лише 2 символи, але може містити до 4 (якщо тільки 6) stackoverflow.com/questions/9533258/… . (Я думаю, що лише utf-16 мав справді довгі гидоти, які могли зруйнувати вашу систему)
ebyrob

7

Якщо ви збираєтесь використовувати лише підмножину US-ASCII (або ISO 646) UTF-8, то немає реальної переваги тому чи іншому; насправді все закодовано однаково.

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

ISO 8859 дійсно корисний лише для європейських алфавітів. Щоб підтримувати більшість алфавітів, які використовуються в більшості китайських, японських, корейських, арабських тощо, алфавітів, ви повинні використовувати деякі зовсім інші кодування. Деякі з них (наприклад, JIS Shift для японців) є абсолютним болем для боротьби. Якщо є якийсь шанс, що ви коли-небудь захочете їх підтримати, я вважаю, що варто використовувати 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?
Pacerier

Окрім того, щоб обмежити себе цими 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.