В чем разница между 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). Первоначально кодирование переменной длины, последнее однобайтовое кодирование фиксированной длины. Latin-1 кодирует только первые 256 кодовых точек набора символов Unicode, тогда как UTF-8 может использоваться для кодирования всех кодовых точек. На физическом уровне кодирования только кодовые точки 0 - 127 кодируются одинаково; кодовые точки 128 - 255 отличаются тем, что становятся 2-байтовой последовательностью с UTF-8, тогда как они являются одиночными байтами с Latin-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 или «Латинская-1». Как и в UTF-8, 7-битный безопасный ASCII остается неизменным независимо от используемого семейства кодирования.
Недостатком этой схемы кодирования является ее неспособность приспособить языки, содержащие более 128 символов, или безопасно отображать более одного семейства символов одновременно. Кроме того, кодировки ISO-8859 потеряли популярность с ростом UTF. «Рабочая группа» ИСО, ответственная за ее расформирование в 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, которые должны быть совместимы со всем).
С другой стороны, файлы, которые как unicode, так и ascii-кодировки не могут прочитать, потому что в них есть байт 0xc0
, похоже, правильно считываются iso-8859-1. Предостережение заключается в том, что в файле, конечно, не должно быть символов юникода.
Еще одна важная вещь для понимания: если вы видите 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 (iso-8859) на 100% совместима для хранения в хранилище данных utf8. Все символы ascii и extended-ascii будут храниться как однобайтовые.
Иначе, от utf8 до Latin1 кодировка может или не может работать. Если есть какие-либо 2-байтовые символы (за пределами extended-ascii 255), они не будут храниться в хранилище данных Latin1.