В чем разница между UTF-8 и ISO-8859-1?

Ответы:

321

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

Игнасио Васкес-Абрамс
источник
11
Следует отметить, что ASCII простирается от 0 до 127. MSB всегда 0.
Hritik
3
Когда определены кодовые точки выше 127, система кодирования является версией расширенного ASCII.
Рохан
1
@RohanBhale Не используйте фразу Extended ASCII; это только вызовет замешательство.
Мистер Листер
Но расширенный ASCII может быть правильным термином. Я прочитал это на нескольких ресурсах
Рохан Бхал
135

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

StaxMan
источник
@mu, возможно, мое утверждение было неоднозначным, но оно не является неправильным - я говорил не о закодированных байтовых последовательностях, а о кодируемых наборах символов; Это означает, что ISO-8859-1 используется для кодирования первых 256 кодовых точек набора символов Unicode.
StaxMan
Ваше разъяснение работает для меня, и «двусмысленный» был бы лучшим выбором слова, чем «неправильный».
мю слишком короткое
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 или «Латинская-1». Как и в UTF-8, 7-битный безопасный ASCII остается неизменным независимо от используемого семейства кодирования.

Недостатком этой схемы кодирования является ее неспособность приспособить языки, содержащие более 128 символов, или безопасно отображать более одного семейства символов одновременно. Кроме того, кодировки ISO-8859 потеряли популярность с ростом UTF. «Рабочая группа» ИСО, ответственная за ее расформирование в 2004 году, оставила техническое обслуживание своему родительскому подкомитету.

Sammitch
источник
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 кодовых точек. Из них 2 048 являются суррогатами, 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'
Cyker
источник
21

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

Шиталь шах
источник
1
Я видел, где умлауты не были конвертированы с UTF8. Мы видели примеры этого и в процессе поиска мы нашли ISO-8859-1, и, похоже, он работает. У нас много немецких ученых, с которыми мы работаем.
Агги Джон 87
4
Умлауты представлены в виде двух символов в utf8. Они хорошо конвертируются и работают хорошо. Проблема исходит от программ, которые ожидают 1 байт на символ. Для этих устаревших программ ISO-8859-1 имеет умблат из 1 байта.
Эрик Аронести
3

С другой стороны, файлы, которые как unicode, так и ascii-кодировки не могут прочитать, потому что в них есть байт 0xc0, похоже, правильно считываются iso-8859-1. Предостережение заключается в том, что в файле, конечно, не должно быть символов юникода.

Нихил В.Ю.
источник
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 (iso-8859) на 100% совместима для хранения в хранилище данных utf8. Все символы ascii и extended-ascii будут храниться как однобайтовые.

Иначе, от utf8 до Latin1 кодировка может или не может работать. Если есть какие-либо 2-байтовые символы (за пределами extended-ascii 255), они не будут храниться в хранилище данных 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 символы латинского-1 (т. Е. Кодовые точки выше 127) не могут быть закодированы как один байт в UTF-8.
RDB