В чем точная разница между Windows-1252(1/3/4) и ISO-8859-1?


Мы размещаем PHP-приложения на установке LAMP на основе Debian. Все в порядке - с точки зрения производительности, администрирования и управления. Однако, будучи несколько новыми разработчиками (мы все еще учимся в средней школе), мы столкнулись с некоторыми проблемами с кодировкой символов для западных кодировок.

Проведя множество исследований, я пришел к выводу, что информация в Интернете несколько сбивает с толку. Речь идет о том, что Windows-1252 совместима с ANSI и полностью совместима с ISO-8859-1.

Итак, в любом случае, в чем разница между Windows-1252(1/3/4) и ISO-8859-1? И вообще, какое отношение к этому имеет ANSI?

Какую кодировку мы должны использовать на наших серверах Debian (и рабочих станциях), чтобы гарантировать, что клиенты получат всю информацию надлежащим образом и что мы не потеряем никаких символов по пути?

Author: Benjamin, 2013-10-01

4 answers

Я хотел бы ответить на этот вопрос в более веб-стиле, и для того, чтобы ответить на него, нам нужно немного истории. Джоэл Сполски написал очень хорошую вводную статью об абсолютном минимуме, который каждый разработчик должен знать о кодировке символов Юникода. Потерпите меня здесь, потому что это будет своего рода ответ looong.:)

В качестве истории я укажу на некоторые цитаты оттуда: (Большое вам спасибо, Джоэл!:))

Единственные символы, которые имели значение старые добрые английские буквы без акцента, и у нас был код для них под названием ASCII, который мог представлять каждый символ, используя число от 32 до 127. Пробел составлял 32, буква "А" - 65 и т.д. Это может быть удобно сохранено в 7 битах. Большинство компьютеров в те дни использовали 8-битные байты, так что вы могли не только хранить все возможные символы ASCII, но и иметь целый бит в запасе, который, если бы вы были злым, вы могли бы использовать в своих собственных коварных целях.

И все было хорошо, если предположить, что вы говорите по-английски. Поскольку в байтах есть место для восьми битов, многие люди подумали: "Боже, мы можем использовать коды 128-255 для наших собственных целей". Проблема была в том, что у многих людей была эта идея одновременно, и у них были свои собственные представления о том, что должно быть где в пространстве от 128 до 255.

Итак, теперь "наборы символов OEM" распространялись вместе с ПК, и все они по-прежнему были разными и несовместимыми. И к нашему современному изумлению - это все было в порядке! У них тогда не было Интернета, и люди редко обменивались файлами между системами с разными языками.

Джоэл продолжает говорить:

На самом деле, как только люди начали покупать компьютеры за пределами Америки, были придуманы всевозможные наборы символов OEM, которые все использовали верхние 128 символов для своих собственных целей. В конце концов этот OEM-продукт, бесплатный для всех, был кодифицирован в стандарте ANSI. В стандарте ANSI все согласились с тем, что делать ниже 128, что было почти то же самое, что и ASCII, но было много разных способов обработки символов от 128 и выше, в зависимости от того, где вы жили. Эти различные системы назывались кодовыми страницами.

И вот так, в конце концов, родились "Кодовые страницы Windows". На самом деле они были "воспитаны" кодовыми страницами DOS. А потом родился Юникод! :) и UTF-8 - это "другая система для хранения вашей строки кодовых точек Юникода" и фактически "каждый код точка от 0-127 хранится в одном байте" и совпадает с ASCII. Я больше не буду вдаваться в подробности Юникода и UTF-8, но вы должны прочитать спецификацию , Конечность и Кодировка символов в целом.

В "заговоре ANSI" Microsoft фактически допускает промах в маркировке Windows-1252 в глоссарии терминов:

Так называемый набор символов Windows (winlatin1, или кодовая страница Windows 1252, для будьте точны) использует некоторые из этих позиций для печатаемых символов. Таким образом, набор символов Windows НЕ идентичен стандарту ISO 8859-1. Набор символов Windows часто называют "набором символов ANSI", но это СЕРЬЕЗНО ВВОДИТ В ЗАБЛУЖДЕНИЕ. Он НЕ был одобрен ANSI.

Таким образом, ANSI при обращении к наборам символов Windows не сертифицирован по ANSI! :)

Как указала Юкка (спасибо вам за хороший ответ)

Windows-1252 ISO Латинский 1, также известный как ISO-8859-1 в качестве кодировки символов, так что диапазон кодов от 0x80 до 0x9F зарезервирован для управляющих символов в ISO-8859-1 (так называемые элементы управления C1), где в Windows-1252 некоторые коды назначаются печатным символам (в основном знакам препинания), другие остаются неопределенными.

Однако мое личное мнение и техническое понимание заключается в том, что как Windows-1252, так и ISO-8859-1 НЕ ЯВЛЯЮТСЯ ВЕБ-КОДИРОВКАМИ!:) Итак:

  • Для веб-страниц, пожалуйста используйте UTF-8 в качестве кодировки для содержимого Поэтому храните данные в формате UTF-8 и "выкладывайте" их с помощью HTTP-заголовка : Content-Type: text/html; charset=utf-8.

    Существует также такая вещь, как мета-тег типа содержимого HTML: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> Теперь, что на самом деле делают браузеры, когда они сталкиваются с этим тегом, так это то, что они снова начинают с начала HTML-документа, чтобы они могли переинтерпретировать документ в объявленной кодировке. Это должно происходить только в том случае, если нет заголовка "Тип содержимого".

  • Использовать другие конкретные кодировки, если пользователям вашей системы нужны файлы, созданные на ее основе. Например, некоторым западным пользователям могут потребоваться файлы, созданные в Excel, или CSV-файлы в Windows-1252. Если это так, закодируйте текст в этой локали, а затем сохраните его в fs и предоставьте в качестве файла, доступного для загрузки.

  • Есть еще одна вещь, о которой следует знать в дизайне HTTP: Механизм распространения кодирования контента должен работать следующим образом.

    I. Клиент запрашивает веб- страница в определенном контенте - типы и кодировки с помощью: заголовков запроса "Принять" и "Принять кодировку" .

    II. Затем сервер (или веб-приложение) возвращает содержимое, перекодированное в эту кодировку и набор символов.

Это НЕ ОТНОСИТСЯ к большинству современных веб-приложений. Что на самом деле происходит, так это то, что веб-приложения обслуживают (заставляют клиента) контент в формате UTF-8. И это работает, потому что браузеры интерпретируют полученные документы на основе заголовков ответов и не от того, чего они на самом деле ожидали.

Мы все должны перейти на Юникод, поэтому, пожалуйста, пожалуйста, пожалуйста, используйте UTF-8 для распространения вашего контента везде, где это возможно и наиболее применимо. Иначе старейшины Интернета будут преследовать вас! :)

P.S. Еще несколько хороших статей об использовании символов MS Windows на веб-страницах можно найти здесь и здесь.

 27
Author: Borislav Sabev, 2017-09-04 19:05:18

Наиболее авторитетной ссылкой на значения имен кодировок символов является реестр IANA Наборы символов.

Windows-1252 обычно известна как Windows Latin 1 или как Windows Западноевропейская или что-то в этом роде. Он отличается от ISO Latin 1, также известного как ISO-8859-1 в качестве кодировки символов, так что диапазон кодов от 0x80 до 0x9F зарезервирован для управляющих символов в ISO-8859-1 (так называемые элементы управления C1), где в Windows-1252 некоторые коды назначены печатаемые символы (в основном знаки препинания), другие остаются неопределенными.

АНСИ приходит сюда как неправильное название. Microsoft однажды представила Windows-1252 в Американский национальный институт стандартов (ANSI) для принятия в качестве стандарта; предложение было отклонено, но Microsoft по-прежнему называет свой код "ANSI". Для дальнейшей путаницы они могут использовать "ANSI" для различных кодировок (в основном, "собственная 8-разрядная кодировка" установки Windows).

В веб-контексте, объявляя ISO-8859-1 будет принят так, как если бы вы объявили Windows-1252. Причина в том, что элементы управления C1 не используются или не полезны в Интернете, в то время как добавленные символы часто используются даже на страницах, неправильно помеченных как ISO-8859-1. Так что с практической точки зрения не имеет значения, какой из них вы декларируете.

Возможно, все еще существуют некоторые браузеры, которые на самом деле интерпретируют данные как ISO-8859-1, если так объявлено, но они, должно быть, очень редки (последнее, что я помню, была версия Opera около десяти лет назад).

Вы делаете не описывайте, с какими проблемами вы столкнулись. Наиболее распространенной причиной проблем, по-видимому, является то, что данные на самом деле кодируются в формате UTF-8, но объявлены как ISO-8859-1 (или Windows-1252), или наоборот. Это становится реальной проблемой для авторов веб-страниц, если сервер заставляет заголовок Content-Type объявлять кодировку символов, с которой они не могут справиться в своей среде разработки (или не знают, как это сделать).

 14
Author: Jukka K. Korpela, 2017-09-04 19:03:31

8859-1 и 1252

Http://www.w3schools.com/charsets/ref_html_ansi.asp

ANSI (Windows-1252) ANSI был набором символов по умолчанию в Windows до Windows 95.

ANSI также называется Windows-1252.

Важное примечание ANSI и ISO-8859-1 очень похожи. Они отличаются только 32 символами.

В ANSI символы от 128 до 159 используются для некоторых полезных символов, таких как символ Евро.

В ISO-8859-1 эти символы сопоставляются с управляющими символами, которые бесполезны в HTML.

__ поэтому предлагаю посмотреть, является ли 128 символом евро.. если да, то это ANSI/windows 1252. __

Нажмите "Следующая ссылка", чтобы перейти по этой ссылке

Http://www.w3schools.com/charsets/ref_html_8859.asp

Коды от 128 до 159 не используются в ISO-8859-1, но многие браузеры будут отображать символы из ANSI (Windows-1252) набор символов вместо ничего.

Эти 2 ссылки перечисляют их обоих.

 1
Author: barlop, 2015-08-04 04:34:18

В этой таблице дается обзор различий. Он показывает все символы, которые определены в Windows-1252, но недоступны в ISO-8859-1/ ISO-8859-15:

        │  …0  │  …1  │  …2  │  …3  │  …4  │  …5  │  …6  │  …7  │  …8  │  …9  │  …A  │  …B  │  …C  │  …D  │  …E  │  …F  │
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
     8… │   €  │      │   ‚  │   ƒ  │   „  │   …  │   †  │   ‡  │   ˆ  │   ‰  │   Š  │   ‹  │   Œ  │      │   Ž  │      │
Unicode │ 20AC │      │ 201A │ 0192 │ 201E │ 2026 │ 2020 │ 2021 │ 02C6 │ 2030 │ 0160 │ 2039 │ 0152 │      │ 017D │      │
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
     9… │      │  ‘   │   ’  │   “  │   ”  │   •  │   –  │   —  │   ˜  │   ™  │   š  │   ›  │   œ  │      │   ž  │   Ÿ  │
Unicode │      │ 2018 │ 2019 │ 201C │ 201D │ 2022 │ 2013 │ 2014 │ 02DC │ 2122 │ 0161 │ 203A │ 0153 │      │ 017E │ 0178 │

В отличие от Windows-1252 диапазон 0x80...0x9F используется для Управляющих кодов в ISO-8859-1.

В этой таблице показаны различия между Windows-1252, ISO-8859-1 и ISO-8859-15

Character    │    € │   Š │   š │   Ž │   ž │   Œ │   œ │   Ÿ │  ¤ │  ¦ │  ¨ │  ´ │  ¸ │  ¼ │  ½ │  ¾ │
───────────────────────────────────────────────────────────────────────────────────────────────────────
ISO 8859-1   │    – │   – │   – │   – │   – │   – │   – │   – │ A4 │ A6 │ A8 │ B4 │ B8 │ BC │ BD │ BE │
ISO 8859-15  │   A4 │  A6 │  A8 │  B4 │  B8 │  BC │  BD │  BE │  – │  – │  – │  – │  – │  – │  – │  – │
Windows-1252 │   80 │  8A │  9A │  8E │  9E │  8C │  9C │  9F │ A4 │ A6 │ A8 │ B4 │ B8 │ BC │ BD │ BE │
Unicode      │ 20AC │ 160 │ 161 │ 17D │ 17E │ 152 │ 153 │ 178 │ A4 │ A6 │ A8 │ B4 │ B8 │ BC │ BD │ BE │
 0
Author: Wernfried Domscheit, 2018-02-22 15:14:50