UTF-8 と ISO-8859-1 の違いは何ですか?
UTF-8は、任意のUnicode文字を表すことができるマルチバイトエンコーディングです。 ISO 8859-1は、最初の256個のUnicode文字を表すことができるシングルバイトエンコーディングです。どちらもASCIIをまったく同じ方法でエンコードします。
UTF は、最大2 ^ 31 [約20億]の文字を表すことができる Unicode コードポイントを表すことができるマルチバイトエンコーディングスキームのファミリーです。 UTF-8 は最初の2 ^ 21(およそ200万)のコードポイントを表すために1から4バイトを使う柔軟なエンコーディングシステムです。
長編短編:127以下のコードポイント/序数表現を持つ任意の文字、別名7ビットセーフASCIIは、他のほとんどのシングルバイトエンコーディングと同じ1バイトシーケンスで表されます。 127を超えるコードポイントを持つ文字はすべて、2バイト以上のシーケンスで表され、エンコーディングの詳細は here で最もよく説明されています。
ISO-8859 は127から255の範囲内で表現できるアルファベットを表現するために使用されるシングルバイトエンコーディングスキームのファミリーです。これらの様々なアルファベットはフォーマットISO-8859-の「部分」として定義されます。 n、これらの中で最もよく知られているのは ISO-8859-1 別名 'Latin-1'です。 UTF-8と同様に、7ビットセーフASCIIは、使用されているエンコーディングファミリに関係なく、影響を受けません。
この符号化方式の欠点は、128を超えるシンボルで構成される言語に対応できないこと、または一度に複数のファミリのシンボルを安全に表示できないことです。同様に、ISO-8859のエンコーディングはUTFの台頭に伴って好まれなくなりました。それを担当しているISOの「作業部会」は2004年に解散し、メンテナンスはその親小委員会に任されました。
ISO-8859-1は1980年代からのレガシー規格です。 256文字しか表現できないため、西欧諸国の一部の言語にのみ適しています。サポートされている多くの言語でも、一部の文字が欠落しています。このエンコーディングでテキストファイルを作成し、いくつかの漢字をコピー/貼り付けしようとすると、奇妙な結果になります。つまり、使わないでください。 Unicodeが世界中を引き継いできていて、あなたが何らかの旧来の理由(すべてとの互換性が必要なHTTPヘッダーのような)を持っていない限り、UTF-8は最近の標準です。
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'
別の観点から見ると、UnicodeとASCIIの両方のエンコーディングでファイルに0xc0
というバイトが含まれているために読み取りに失敗するファイルは、iso-8859-1によって正しく読み取られるようです。注意点は、ファイルにはもちろんUnicode文字があってはいけないということです。
私がこの質問を調査した理由はその観点からでした、それらがどのように互換性があるかということです。 Latin1文字セット(iso-8859)は、utf8データストアに格納するために100%互換性があります。すべてのASCII文字と拡張ASCII文字はシングルバイトとして格納されます。
逆に言えば、utf8からLatin1文字セットまでは動くかもしれません。 2バイトの文字(拡張ASCII 255を超える文字)がある場合、それらはLatin1データストアに格納されません。