web-dev-qa-db-ja.com

Windows-1252(1/3/4)とISO-8859-1の正確な違いは何ですか?

私たちは、DebianベースのLAMPインストールでPHPアプリをホストしています。パフォーマンス、管理、管理に関してはすべて大丈夫です。 'Western Charsetsの文字エンコードでいくつかの問題が発生しました。

多くの研究を行った後、オンラインの情報はやや混乱しているという結論に達しました。 Windows-1252がANSIであり、ISO-8859-1に完全に対応していることを意味しています。

とにかく、Windows-1252(1/3/4)とISO-8859-1の違いは何ですか?そして、とにかく、ANSIはどこに来るのでしょうか?

クライアントが意図した方法ですべての情報を取得し、途中で文字が失われないようにするために、Debianサーバー(およびワークステーション)でどのエンコードを使用する必要がありますか?

32
user2831360

これにもっとウェブのように答えたいと思います。それに答えるには少し歴史が必要です。 Joel Spolsky は、すべての開発者がUnicode文字エンコーディングについて知っておくべき絶対的な最小値について非常に 良い紹介記事 を書いています。これはいくぶんlooongの回答になるからです。 :)

歴史として、私はそこからいくつかの引用を指摘します:(ありがとう、ジョエル!:))

重要な文字は、古き良きアクセントのない英語の文字だけで、ASCIIという32文字から127文字の数字を使用してすべての文字を表現できるコードがありました。スペースは32、文字「A」は65などでした。これは7ビットで便利に保存できました。当時のほとんどのコンピューターは8ビットバイトを使用していたため、可能な限りすべてのASCIIしかし、あなたには十分な余裕があり、もしあなたが邪悪なら、あなたはあなた自身の不正な目的のために使うことができました。

そして、あなたが英語の話者であると仮定して、すべては良かったです。バイトには最大8ビットのスペースがあるため、多くの人が「まあ、128-255のコードを自分の目的に使用できる」と考え始めました。問題は、多くの人々が同時にこの考えを持ち、128から255までの空間のどこに行くべきかについての彼ら自身の考えを持っていました。

そのため、「OEM文字セット」はPCとともに配布され、これらはすべて異なっており、互換性がありませんでした。そして私たちの現代的な驚きに-それはすべて大丈夫でした!彼らはインターネットに戻ることができず、人々はめったにロケールの異なるシステム間でファイルを交換しませんでした。

ジョエルはこう言っています:

実際、人々がアメリカ国外でPCを購入し始めるとすぐに、すべての種類の異なるOEM文字セットが夢に見られました。最終的に、このOEMはすべて無料で、ANSI標準で体系化されました。 ANSI規格では、128以下で何をすべきか誰もが同意しました。これはASCIIとほぼ同じですが、住んでいた場所に応じて、128以降の文字を処理する方法がたくさんありました。これらの異なるシステムは code pages と呼ばれていました。

そして、これが最終的に「Windowsコードページ」が生まれた方法です。実際には、DOSコードページによって「ペアレント化」されていました。そして、ユニコードが誕生しました! :)および TF-8 は「Unicodeコードポイントの文字列を格納するための別のシステム」であり、実際には「0-127からのすべてのコードポイントは1バイトに格納されます」であり、-と同じです [〜#〜] ascii [〜#〜] 。ユニコードとUTF-8の詳細については説明しませんが、 [〜#〜] bom [〜#〜]エンディアンネス 、および- 文字エンコーディング 全般として。

「ANSIの陰謀」について、Microsoftは実際には Windows-1252用語集 の誤表示を認めています。

いわゆるWindows文字セット(正確にはWinLatin1、またはWindowsコードページ1252)は、印刷可能な文字にこれらの位置の一部を使用します。したがって、Windowsの文字セットはISO 8859-1と同一ではありません。 Windowsの文字セットはしばしば「ANSI文字セット」と呼ばれますが、これは非常に誤解を招くものです。 ANSIによって承認されていません。

したがって、Windows文字セットを参照する場合の ANSIはANSI認定ではありません! :)

ユッカが指摘したように(クレジットはニースの答えのためにあなたに行きます)

Windows-1252 ISO Latin 1、文字エンコードとしてISO-8859-1とも呼ばれるため、コード範囲0x80〜0x9Fは、ISO-8859-1(いわゆるC1コントロール)の制御文字用に予約されています。 -1252、そこにあるコードの一部は印刷可能な文字(主に句読点文字)に割り当てられ、他のコードは未定義のままです。

しかし、私の個人的な意見と技術的な理解は、Windows-1252とISO-8859-1 の両方がWebエンコードではないということです! :) そう:

  • Webページの場合、コンテンツのエンコードとしてUTF-8を使用してください。データをUTF-8として保存し、 HTTPヘッダーContent-Type: text/html; charset=utf-8で「吐き出します」。

    HTML content-type meta-tag<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">と呼ばれるものもあります。このタグに遭遇したときにブラウザが実際に行うことは、HTMLドキュメントの先頭から再び開始することです。宣言されたエンコーディングでドキュメントを再解釈できるようにします。これは、「Content-type」ヘッダーがない場合にのみ発生します。

  • システムのユーザーがそこから生成されたファイルを必要とする場合、他の特定のエンコーディングを使用します。たとえば、一部の西洋のユーザーは、Excel-1で生成されたファイル、またはWindows-1252のCSVを必要とする場合があります。この場合は、そのロケールでテキストをエンコードしてからfsに保存し、ダウンロード可能なファイルとして提供します。

  • HTTP の設計には、もう1つ注意すべきことがあります。コンテンツエンコーディングの配信メカニズムは、このように機能する必要があります。

    I。クライアントは、「Accept」および「Accept-Charset」を介して特定のコンテンツタイプおよびエンコーディングでWebページを要求します request headers

    II。その後、サーバー(またはWebアプリケーション)は、そのエンコードと文字セットにトランスコードされたコンテンツを返します。

これは、ほとんどの最新のWebアプリの場合ではありません。実際にWebアプリケーションがUTF-8としてコンテンツを提供する(クライアントに強制する)とどうなりますか。また、ブラウザは受信したドキュメントを、実際に予期したものではなく、応答ヘッダーに基づいて解釈するため、これが機能します。

ユニコードを使用する必要がありますので、可能な限りUTF-8を使用してコンテンツを配布し、必要に応じてコンテンツを配布してください。または、 インターネットの長老たち に悩まされます! :)

追伸WebページでのMS Windows文字の使用に関するその他の素敵な記事が here および here にあります。

32
Borislav Sabev

文字エンコーディング名の意味に対する最も信頼できる参照は、IANAレジストリ Character Sets です。

Windows-1252は、一般にWindows Latin 1またはWindows West Europeanなどとして知られています。 ISOラテン1とは異なり、文字エンコーディングとしてISO-8859-1とも呼ばれるため、コード範囲0x80〜0x9Fは、ISO-8859-1(いわゆるC1コントロール)の制御文字用に予約されています。 -1252、そこにあるコードの一部は印刷可能な文字(主に句読点文字)に割り当てられ、他のコードは未定義のままです。

ANSIは誤った呼び名としてここに来ます。 MicrosoftはかつてWindows-1252を米国規格協会(ANSI)に提出し、標準として採用しました。提案は拒否されましたが、Microsoftは依然としてコードを「ANSI」と呼んでいます。さらに混乱を招くため、differentエンコーディング(基本的には、Windowsインストールの「ネイティブ8ビットエンコーディング」)に「ANSI」を使用する場合があります。

Webコンテキストでは、ISO-8859-1の宣言は、Windows-1252を宣言したかのように扱われます。その理由は、WebではC1 Controlsが使用されていないか、有用ではないのに対し、追加された文字は、ISO-8859-1と誤ってラベル付けされたページでも使用されることが多いためです。したがって、実際には、どちらを宣言するかは重要ではありません。

宣言されている場合、実際にデータをISO-8859-1として実際に解釈する一部のブラウザーが存在する場合がありますが、それらは非常にまれであるに違いありません(最後に見たのは、約10年前のOpera )。

どのような問題に遭遇したかを説明しません。問題の最も一般的な原因は、データが実際にUTF-8でエンコードされているが、ISO-8859-1(またはWindows-1252)として宣言されている、またはその逆であるようです。これは、サーバーforcesa Content-Typeヘッダーは文字エンコードを宣言しますが、オーサリング環境で処理できない(または、その方法がわからない)ヘッダーです。

15

ANSI (Windows-1252) 英語/ラテンアルファベットのある国、例えばUK/US/France/Germanyなどは、Windows-1252エンコーディングを指します。 https://web.archive.org/web/20170916200715/http://www.Microsoft.com:80/resources/msdn/goglobal/default.mspx

Windows-1252。とISO-8859-1は非常に似ています。違いは32文字のみです。

Windows-1252では、128〜159の文字がユーロ記号などの便利な文字に使用されます。

ISO-8859-1では、これらの文字はHTMLでは役に立たない制御文字にマップされます。

__したがって、提案は128がユーロ記号かどうかを確認します。それがWindows 1252である場合。__

128〜159のコードはISO-8859-1では使用されていませんが、多くのブラウザはWindows-1252)文字セットの文字を何も表示せずに表示します。

これら2つのリンクには、両方がリストされています。

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

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

いくつかのコメントは非常に役に立ち、それに基づいて投稿を修正しました。

Chenfengは、Windowsでは、「ANSI」は、ロケール(アラビア語/中国語/キリル語/ベトナム語/ ...)で指定されたシステムコードページを指します。 [必ずしも] Windows-1252を参照することはありません。これをテストするには、ロケールを変更し、notepad.exeを使用して「ANSI」にテキストファイルを保存します。このMSドキュメントによると、14種類の「ANSI」コードページがあります https://docs.Microsoft.com/en-us/windows/desktop/intl/code-page-identifiers

Wernfriendが指摘する https://web.archive.org/web/20170916200715/http://www.Microsoft.com:80/resources/msdn/goglobal/default.mspx とそのコードページ437 「OEMコードページ」(OEM列を参照)であり、OEMコードページはcmdプロンプトで使用されるものです。そして、彼はそのウェブページから、英語やラテンアルファベット以外の多くの国ではansiがWindows 1252ではないことを指摘/示唆しています。たとえば、ヘブライ語ansiは1255を使用しています(ヘブライ語OEMコードページは862)。

2
barlop

次の表に、違いの概要を示します。 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とは異なり、ISO-8859-1の 制御コード には0x80…0x9Fの範囲が使用されます。

この表は、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 │
1