У чому різниця між UTF-8 і ISO-8859-1 ?
У чому різниця між UTF-8 і ISO-8859-1 ?
Відповіді:
UTF-8 - багатобайтове кодування, яке може представляти будь-який символ Unicode. ISO 8859-1 - це однобайтове кодування, яке може представляти перші 256 символів Unicode. Обидва кодують ASCII точно однаково.
Вікіпедія досить добре пояснює: UTF-8 проти Latin-1 (ISO-8859-1). Former - це кодування змінної довжини, останнє однобайтове кодування з фіксованою довжиною. Latin-1 кодує лише перші 256 кодових точок набору символів Unicode, тоді як UTF-8 може використовуватися для кодування всіх точок коду. На рівні фізичного кодування лише кодові точки 0 - 127 кодуються однаково; кодові точки 128 - 255 відрізняються тим, що стають двобайтовою послідовністю з UTF-8, тоді як вони є однобайтовими з латинським-1.
UTF - це сімейство багатобайтових схем кодування, які можуть представляти кодові точки Unicode, які можуть представляти до 2 ^ 31 [приблизно 2 мільярди] символів. UTF-8 - це гнучка система кодування, яка використовує від 1 до 4 байтів, щоб представити перші 2 ^ 21 [приблизно 2 мільйони] кодових точок.
Короткий опис: будь-який символ із кодовою точкою / порядковим поданням нижче 127, також 7-бітовий безпечний ASCII, представлений тією ж 1-байтовою послідовністю, що і більшість інших однобайтових кодувань. Будь-який символ з кодовою точкою вище 127 представлений послідовністю з двох або більше байтів, тут найкраще пояснюються деталі кодування .
ISO-8859 - це сімейство однобайтових схем кодування, що використовуються для представлення алфавітів, які можуть бути представлені в діапазоні від 127 до 255. Ці різні алфавіти визначені як "частини" у форматі ISO-8859- n , найбільш відомий з це, швидше за все, ISO-8859-1, відомий як "Latin-1". Як і у UTF-8, 7-бітовий безпечний ASCII залишається незмінним, незалежно від використовуваного сімейства кодування.
Недоліком цієї схеми кодування є її нездатність вмістити мови, що складаються з понад 128 символів, або безпечно відображати більше, ніж одне сімейство символів одночасно. Крім того, кодування ISO-8859 вийшли з ладу з підвищенням UTF. ISO "Робоча група", відповідальна за це, розпустилась у 2004 році, залишивши технічне обслуговування до свого материнського підкомітету.
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'
ISO-8859-1 - це застарілі стандарти ще з 1980-х років. Він може представляти лише 256 символів, що підходить лише для деяких мов західного світу. Навіть для багатьох підтримуваних мов деякі символи відсутні. Якщо ви створите текстовий файл у цій кодуванні та спробуйте скопіювати / вставити деякі китайські символи, ви побачите дивні результати. Іншими словами, не використовуйте це. Unicode перейняв увесь світ, а UTF-8 майже сьогодні є стандартами, якщо у вас є деякі застарілі причини (наприклад, заголовки HTTP, які повинні бути сумісні з усім).
Ще одна важлива річ, яку потрібно усвідомити: якщо ви бачите 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.
Моя причина дослідження цього питання була з точки зору, в чому вони сумісні. Latin1 charset (iso-8859) на 100% сумісний для зберігання у сховищі даних utf8. Усі символи ascii & Exteci-ascii будуть зберігатися як однобайтові.
Якщо піти іншим способом, від utf8 до Latin1 шаблону може чи не може працювати. Якщо є якісь 2-байтові символи (символи, що перевищують 255 розширених ascii), вони не зберігатимуться у сховищі даних Latin1.