Чим відрізняється UTF-8 від ISO-8859-1?


Відповіді:


321

UTF-8 - багатобайтове кодування, яке може представляти будь-який символ Unicode. ISO 8859-1 - це однобайтове кодування, яке може представляти перші 256 символів Unicode. Обидва кодують ASCII точно однаково.


11
Варто зазначити, що ASCII поширюється від 0 до 127. MSB завжди 0.
Hritik

3
Коли визначені кодові точки вище 127, система кодування - це версія Extended ASCII.
Рохан Бхале

1
@RohanBhale Не використовуйте фразу Extended ASCII; це спричинить лише плутанину.
Містер Лістер

Але правильний термін може бути правильним. Я читав його на кількох ресурсах
Рохан Бхале

135

Вікіпедія досить добре пояснює: UTF-8 проти Latin-1 (ISO-8859-1). Former - це кодування змінної довжини, останнє однобайтове кодування з фіксованою довжиною. Latin-1 кодує лише перші 256 кодових точок набору символів Unicode, тоді як UTF-8 може використовуватися для кодування всіх точок коду. На рівні фізичного кодування лише кодові точки 0 - 127 кодуються однаково; кодові точки 128 - 255 відрізняються тим, що стають двобайтовою послідовністю з UTF-8, тоді як вони є однобайтовими з латинським-1.


@mu, можливо, моє твердження було неоднозначним, але це невірно - я говорив не про кодовані послідовності байтів, а про кодові набори символів; тобто ISO-8859-1 використовується для кодування перших 256 точок коду з набору символів Unicode.
StaxMan

Ваше уточнення працює для мене і "неоднозначне" було б кращим вибором слова, ніж "неправильним".
mu занадто короткий

83

UTF

UTF - це сімейство багатобайтових схем кодування, які можуть представляти кодові точки Unicode, які можуть представляти до 2 ^ 31 [приблизно 2 мільярди] символів. UTF-8 - це гнучка система кодування, яка використовує від 1 до 4 байтів, щоб представити перші 2 ^ 21 [приблизно 2 мільйони] кодових точок.

Короткий опис: будь-який символ із кодовою точкою / порядковим поданням нижче 127, також 7-бітовий безпечний ASCII, представлений тією ж 1-байтовою послідовністю, що і більшість інших однобайтових кодувань. Будь-який символ з кодовою точкою вище 127 представлений послідовністю з двох або більше байтів, тут найкраще пояснюються деталі кодування .

ISO-8859

ISO-8859 - це сімейство однобайтових схем кодування, що використовуються для представлення алфавітів, які можуть бути представлені в діапазоні від 127 до 255. Ці різні алфавіти визначені як "частини" у форматі ISO-8859- n , найбільш відомий з це, швидше за все, ISO-8859-1, відомий як "Latin-1". Як і у UTF-8, 7-бітовий безпечний ASCII залишається незмінним, незалежно від використовуваного сімейства кодування.

Недоліком цієї схеми кодування є її нездатність вмістити мови, що складаються з понад 128 символів, або безпечно відображати більше, ніж одне сімейство символів одночасно. Крім того, кодування ISO-8859 вийшли з ладу з підвищенням UTF. ISO "Робоча група", відповідальна за це, розпустилась у 2004 році, залишивши технічне обслуговування до свого материнського підкомітету.


1
+1, щоб відповісти на питання, але виходити за межі та пропонувати інформацію про пов'язані кодування. Re: кодові точки для UTF-8, згідно з stackoverflow.com/a/38488358/3353984 , UTF-8 підтримує 2 ^ 21 кодові точки. Це помилка чи тут може знадобитися виправлення?
Том Лоредо

1
Unicode - це фактично 17 площин з 2 ^ 16 кодових точок. 0x00_0000 до 0x1F_FFFF. У 17 літаках може розміститися 1114,112 кодових пунктів. З них 2048 - сурогати, 66 - не символи, а 137 468 - зарезервовані для приватного користування, залишивши 974 530 для публічного призначення. Близько 1 мільйона. Дивіться, скільки символів може кодувати UTF-8? .
georgeawg

22
  • ASCII: 7 біт. 128 кодових пунктів.

  • ISO-8859-1: 8 біт. 256 кодових пунктів.

  • UTF-8: 8-32 біт (1-4 байти). 1,112,064 кодових пунктів.

І ISO-8859-1, і UTF-8 назад сумісні з ASCII, але UTF-8 не сумісний з ISO-8859-1:

#!/usr/bin/env python3

c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))

Вихід:

©
b'\xc2\xa9'
b'\xa9'

21

ISO-8859-1 - це застарілі стандарти ще з 1980-х років. Він може представляти лише 256 символів, що підходить лише для деяких мов західного світу. Навіть для багатьох підтримуваних мов деякі символи відсутні. Якщо ви створите текстовий файл у цій кодуванні та спробуйте скопіювати / вставити деякі китайські символи, ви побачите дивні результати. Іншими словами, не використовуйте це. Unicode перейняв увесь світ, а UTF-8 майже сьогодні є стандартами, якщо у вас є деякі застарілі причини (наприклад, заголовки HTTP, які повинні бути сумісні з усім).


1
Я бачив, де Умлаут нібито не перетворений на UTF8. Ми побачили приклади цього, і в пошуку ми знайшли ISO-8859-1 і, здається, він працює. У нас багато німецького вченого, з яким ми працюємо.
Аггі Йон від 87

4
Umlaut's представлені як два символи у utf8. Вони прекрасно перетворюють і працюють добре. Проблема пов'язана з програмами, які очікують 1 байт на символ. Для цих застарілих програм ISO-8859-1 має однобайтний модуль.
Ерік Аронесті

3

З іншого боку, файли, які і кодування unicode, і ascii не вдається прочитати, тому що вони мають байт 0xc0в них, схоже, читають ізо-8859-1 належним чином. Застереження полягає в тому, що у файлі, звичайно, не повинно бути символів unicode.


2

Ще одна важлива річ, яку потрібно усвідомити: якщо ви бачите iso-8859-1, це, мабуть, стосується Windows-1252, а не ISO / IEC 8859-1 . Вони відрізняються в діапазоні 0x80–0x9F, де ISO 8859-1 має контрольні коди C1, а Windows-1252 замість цього корисні видимі символи.

Наприклад, ISO 8859-1 має 0x85 як керуючого символу (в Unicode, U + 0085, ``), тоді як Windows-1252 має горизонтальний еліпсис (в Unicode, U + 2026 HORIZONTAL ELLIPSIS, ).

WHATWG Кодування специфікації (як використовується HTML) прямо заявляє iso-8859-1, що ярлик для windows-1252і веб - браузери не підтримують ISO 8859-1 в будь-якому чином: HTML специфікації не говорить , що все кодування в кодуванні специфікації повинні бути підтримані, і не більше .

Цікаво також, що числові символьні посилання HTML по суті використовують Windows-1252 для 8-бітних значень, а не кодових точок Unicode; на https://html.spec.whatwg.org/#numeric-character-reference-end-state , …вийде U + 2026, а не U + 0085.


На жаль! Думав, що я це написав, але переписав це. Я вклав це зараз.
Кріс Морган

0

Моя причина дослідження цього питання була з точки зору, в чому вони сумісні. Latin1 charset (iso-8859) на 100% сумісний для зберігання у сховищі даних utf8. Усі символи ascii & Exteci-ascii будуть зберігатися як однобайтові.

Якщо піти іншим способом, від utf8 до Latin1 шаблону може чи не може працювати. Якщо є якісь 2-байтові символи (символи, що перевищують 255 розширених ascii), вони не зберігатимуться у сховищі даних Latin1.


2
Корисно, але я думаю, ви мали на увазі 127 замість 255 в розширеному-ascii 255?
Hydroper

18
Latin-1 або iso-8859-1 не на 100% сумісний для зберігання у utf8. Будь-який символ латині-n або iso-8859-n вище 127 не буде переведений на один байт символу utf-8. Однак для значень 1-127 вони точно перекладуть.
Марлін Пірс

4
Ця відповідь є дещо заплутаною у використанні терміна "розширена ascii", який просто є терміном для позначення будь-якого кодування символів, що не є ASCII. UTF-8 і latin-1 - приклади розширених кодувань ASCII. Але символи не-ascii latin-1 (тобто кодові точки вище 127) не можуть бути закодовані як один байт у UTF-8.
rdb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.