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

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

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

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

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

4 ответов


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

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

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

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

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

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

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

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

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

так называемый набор символов Windows (WinLatin1 или кодовая страница Windows 1252, если быть точным) использует некоторые из этих позиций для печати символов. Таким образом, набор символов Windows не идентичен ISO 8859-1. Набор символов Windows часто называют "набор символов ANSI", но это серьезно вводит в заблуждение. Он не был одобрен ANSI.

и ANSI при ссылке на наборы символов Windows не ANSI-сертифицированный! :)

как отметил Юкка (кредиты идут к вам за хороший ответ)

Windows-1252 ISO Latin 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-документа снова, чтобы они могли переинтерпретировать документ в объявленной кодировке. Это должно произойти, только если нет заголовка "Content-type".

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

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

    я клиент запрашивает веб-страницу в определенных типах контента и кодировках через: 'Accept' и 'Accept-Charset'заголовки запроса.

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

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

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

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


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

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

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

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

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

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


8859-1 и 1252

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

ANSI (Windows-1252) ANSI был набором символов по умолчанию в Windows up для 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 ссылки перечисляют их обоих.


эта таблица дает обзор различий. Он показывает все символы, определенные в 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 │