UTF-8とISO-8859-1の違いは何ですか?


回答:


321

UTF-8は、任意のUnicode文字を表すことができるマルチバイトエンコーディングです。ISO 8859-1は、最初の256個のUnicode文字を表すことができるシングルバイトエンコーディングです。どちらもASCIIをまったく同じ方法でエンコードします。


11
ASCIIは0から127までしか拡張されないことに注意してください。MSBは常に0である
Hritik

3
127を超えるコードポイントが定義されている場合、エンコードシステムは拡張ASCIIのバージョンです。
Rohan Bhale、

1
@RohanBhale拡張ASCIIという語句を使用しないでください。混乱を招くだけです。
リスター氏

しかし、拡張アスキーは正しい用語かもしれません。複数のリソースで読みました
Rohan Bhale

135

ウィキペディアは、UTF-8Latin-1(ISO-8859-1)の両方について、かなりよく説明しています。前者は可変長エンコーディングで、後者は1バイト固定長エンコーディングです。Latin-1はUnicode文字セットの最初の256個のコードポイントのみをエンコードしますが、UTF-8はすべてのコードポイントのエンコードに使用できます。物理エンコードレベルでは、コードポイント0〜127のみが同じようにエンコードされます。コードポイント128〜255は、UTF-8では2バイトシーケンスになることで異なりますが、Latin-1では1バイトです。


@mu多分私のステートメントは曖昧ですが、それは不正確ではありません-エンコードされたバイトシーケンスについてではなく、エンコードされている文字セットについて話していました。つまり、ISO-8859-1は、Unicode文字セットの最初の256個のコードポイントをエンコードするために使用されます。
StaxMan 2011

あなたの説明は私にとってはうまくいき、「あいまい」は「正しくない」よりも良い言葉の選択だったでしょう。
muが短すぎる

83

UTF

UTFは、最大2 ^ 31 [約20億]文字を表すことができるUnicodeコードポイントを表すことができるマルチバイトエンコーディングスキーマのファミリです。UTF-8は、最初の2 ^ 21 [約200万]コードポイントを表すために1〜4バイトを使用する柔軟なエンコーディングシステムです。

長い話:コードポイント/序数表現が127未満の文字、つまり7ビットセーフASCIIは、他のほとんどのシングルバイトエンコーディングと同じ1バイトシーケンスで表されます。コードポイントが127を超える文字は、2バイト以上のシーケンスで表されますここでは、エンコードの詳細を説明します

ISO-8859

ISO-8859は、フォーマットの「部」として定義されている127〜255これらの様々なアルファベットの範囲内で表すことができるアルファベットを表すために使用される単一のバイトコード化スキームのファミリーであるISO-8859- Nの最も身近これらはおそらくISO-8859-1(別名 'Latin-1')です。UTF-8と同様に、7ビットセーフのASCIIは、使用されるエンコードファミリに関係なく影響を受けません。

このエンコード方式の欠点は、128を超えるシンボルで構成される言語に対応できない、または一度に複数のシンボルファミリを安全に表示できないことです。同様に、ISO-8859エンコーディングは、UTFの台頭に伴い好まれなくなりました。それを担当するISO「ワーキンググループ」は2004年に解散し、親の小委員会にメンテナンスを任せています。


1
質問に答えるが、関連するエンコーディングに関する情報を提供するための+1。Re:UTF-8のコードポイント、stackoverflow.com /a/ 38488358/3353984によると、UTF-8は2 ^ 21コードポイントをサポートしています。それはエラーですか、それともここで修正が必要ですか?
トムロレド

1
Unicodeは、実際には2 ^ 16コードポイントの17プレーンです。0x00_0000〜0x1F_FFFF。17面は1,114,112コードポイントを収容できます。これらのうち、2,048は代理であり、66は非文字であり、137,468は私的使用のために予約されており、974,530は公開割り当て用に残されています。約100万。UTF-8でエンコードできる文字数をご覧ください
georgeawg

22
  • 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'

21

ISO-8859-1は、1980年代のレガシー規格です。256文字しか表現できないため、西側世界の一部の言語にのみ適しています。サポートされている多くの言語であっても、一部の文字が欠落しています。このエンコーディングでテキストファイルを作成し、一部の漢字をコピー/貼り付けしようとすると、奇妙な結果が表示されます。つまり、使用しないでください。Unicodeが世界を席巻し、UTF-8は、いくつかのレガシーな理由(HTTPヘッダーなど、すべてと互換性が必要なもの)がない限り、最近の標準になっています。


1
UmlautがUTF8で変換されていない可能性がある場所を見ました。この例を見て、検索でISO-8859-1を見つけました。これは機能しているようです。一緒に仕事をしているドイツ人科学者はたくさんいます。
87の

4
Umlautは、utf8では2つの文字として表されます。彼らはうまく変換し、うまく働きます。問題は、文字ごとに1バイトを期待するプログラムから発生します。これらのレガシープログラムの場合、ISO-8859-1には1バイトのウムラウトがあります。
Erik Aronesty 2018

3

別の見方をすると、ユニコードとASCIIエンコーディングの両方にバイトが含ま0xc0れているために読み取りに失敗したファイルは、iso-8859-1によって適切に読み取られるようです。もちろん、ファイルにはUnicode文字を含めないでください。


2

もう1つ重要なことを理解してください。表示されている場合iso-8859-1、それはおそらくISO / IEC 8859-1ではなくWindows-1252を指しています。それらは0x80〜0x9Fの範囲で異なります。ISO8859-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、およびWebブラウザは、どのような方法でISO 8859-1をサポートしていません。これ以上HTMLの仕様は、エンコードスペックのすべてのエンコーディングがサポートされなければならないと言うと、 。

また興味深いことに、HTMLの数字参照は、基本的に、Unicodeコードポイントではなく、8ビット値にWindows-1252を使用します。あたりにhttps://html.spec.whatwg.org/#numeric-character-reference-end-state…U + 2026ではなくU + 0085を生成します。


おっとっと!書いたと思ったのですが、書き直しで無くしてしまいました。私は今それを入れました。
クリスモーガン

0

この質問を研究した理由は、それらがどのように互換性があるかという観点からでした。Latin1文字セット(iso-8859)は、utf8データストアに格納するために100%互換性があります。すべてのASCIIおよび拡張ASCII文字は、1バイトとして格納されます。

逆に言えば、utf8からLatin1の文字セットは機能する場合と機能しない場合があります。2バイト文字(extended-ascii 255を超える文字)がある場合、それらはLatin1データストアに格納されません。


2
役に立ちましたが、拡張ASCII 255で255ではなく127を意味していると思いますか?
Hydroper '19年

18
Latin-1またはiso-8859-1は、utf8に格納するために100%互換性がありません。127を超えるLatin-nまたはiso-8859-n文字は、1バイトのutf-8文字に変換されません。ただし、値が1〜127の場合は、正確に変換されます。
マーリンピアス

4
この答えは、「拡張ascii」という用語の使用を少し混乱させます。これは、ASCII以外の文字エンコーディングを指す用語です。UTF-8およびlatin-1は、拡張ASCIIエンコーディングの例です。ただし、非ASCIIのラテン1文字(つまり、127を超えるコードポイント)は、UTF-8では1バイトとしてエンコードできません。
rdb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.