web-dev-qa-db-ja.com

エンコードの種類が異なるのはなぜですか?

これは初心者向けの質問ですが、エンコードの種類が異なる理由とそれらの違いは何ですか(ASCII、utf-8、16、base64など)。

15
Coola

理由はたくさんあると思いますが、要点は「表示(エンコード)するのに必要な文字数は?」です。たとえば米国に住んでいる場合、ASCIIでかなり遠くまで行くことができます。しかし、多くの郡では、ä、å、üなどの文字が必要です(SO was ASCII only or this this read this as ASCIIエンコードされたテキスト、ä、å、üの場所にいくつかの奇妙な文字が表示されます。)中国、日本、タイ、およびその他の「エキゾチック」な国も考えてください。世界中で見たことがあるのは、きれいな写真ではなく、単なる文字の場合があります。

異なるエンコーディングタイプの違いについては、仕様を確認する必要があります。これがUTF-8用のものです。

私はUTF-16に慣れていません。違いについての情報をいくつか示します。

Base64は、テキストデータを処理するように設計されたメディアを介して保存および転送する必要があるバイナリデータをエンコードする必要がある場合に使用されます。 PHPで何らかの電子メールシステムを作成したことがあるなら、おそらくBase64に出会ったことでしょう。

短い:多くの異なる言語へのコンピュータープログラムのユーザーインターフェイスローカリゼーションをサポートするため。 (プログラミング言語は、主にASCIIエンコーディングで見つかった文字で構成されていますが、たとえばJavaで変数名にUTF-8エンコーディングを使用することは可能ですが、ソースコードファイルは通常、ASCIIエンコードされたテキスト、たとえばUTF-8エンコードなど)以外のものとして保存されます。

短いvol.2で:特定の視点から(または可能であれば視点がなくても)さまざまな人々が何らかの問題を解決しようとしている場合は常に、結果がまったく異なる可能性があります。 Joelのunicode記事(下のリンク)からの引用:「バイトには最大8ビットの余裕があるため、多くの人が「まあ、私たちのコード128-255を自分の目的に使用できる」と考えました。問題はたくさんありました。同時にこのアイデアがあり、128から255の空間のどこに行くべきかについて、独自のアイデアを持っていました。」

すべての情報と議論についてJoachimとtchristに感謝します。ここに私が読んだばかりの二つの記事があります。 (どちらのリンクも先にリンクしたページにあります。)Joelの記事の内容のほとんどは、数年前に最後に読んだので忘れていました。私は希望する主題の良い紹介。マーク・デイビスはもう少し深く行きます。

15
ZZ-bb

非常に多くのバリアントが存在する本当の理由は nicodeコンソーシアム が手遅れになったためです。

当初、メモリとストレージは高価であり、1文字を格納するために8ビット以上(場合によっては7ビットのみ)のメモリを使用することは過剰と考えられていました。したがって、ほとんどすべてのテキストは1文字あたり7ビットまたは8ビットを使用して格納されていました。明らかに、8ビットはall人間の言語の文字を表すのに十分なメモリではありません。 most単一の言語で使用される文字を表現するには、それで十分です(一部の言語では不可能です)。したがって、さまざまな言語(英語、ドイツ語、ギリシャ語、ロシア語など)で文字ごとに8ビットのtheirテキストをエンコードできるように設計された多くの異なる文字エンコード。結局のところ、単一のテキストファイル(通常は単一のコンピューターシステムでさえ)は、単一の言語でしか使用されませんよね?

これにより、合意された文字からあらゆる種類の数字へのマッピングが1つもない状況が発生しました。多くの異なる、互換性のないソリューションが作成され、実際の中央制御は存在しませんでした。使用されている一部のコンピューターシステム [〜#〜] ascii [〜#〜] 、使用されている他のコンピューターシステム [〜#〜] ebcdic [〜#〜] (より正確には: EBCDICの多くのバリエーション)、 ISO-8859-* (またはその多くの派生物の1つ)、または現在ほとんど聞いていないエンコーディングの大きなリストのいずれか。

最後に、Unicodeコンソーシアムは、有用であるがこの回答の範囲外の補助データのlotsと一緒にその単一のマッピングを作成するタスクにステップアップしました)。

Unicodeコンソーシアムが最終的にfairlyコンピューターが表す可能性のある文字の包括的なリストを(具体的なニーズに応じて、バイナリデータにエンコードするためのいくつかのエンコードスキームと共に)作成したとき、他の文字エンコードスキームはすでに広く使用されていました。これにより、Unicodeとそのエンコーディング(UTF-8、UTF-16)の採用が大幅に遅くなりました。

最近では、テキストを表現したい場合、最善の策は、すべてのUnicode文字を表現できる数少ないエンコーディングの1つを使用することです。 UTF-8とUTF-16を組み合わせることで、すべてのユースケースの99%で十分であり、UTF-32は他のほとんどすべてをカバーします。そして明確にするために:すべてのUTF- *エンコーディングはすべての有効なUnicode文字をエンコードできます。ただし、UTF-8とUTF-16は可変幅のエンコーディングであるため、すべてのユースケースに適しているとは限りません。 できないこれらのエンコーディングを処理するレガシーシステムとやり取りする必要がある場合を除いて、最近他の何かを選択する理由はほとんどありません。

9
Joachim Sauer

主な理由は、より多くのキャラクターを表示できるようにすることです。インターネットがまだ始まったばかりの頃は、いつの日か世界中のすべての言語や言語の人々がインターネットを利用するだろうとは誰も考えていませんでした。したがって、小さな文字セットで十分でした。徐々に、それは限定された英語中心であることが明らかになり、したがって、より大きな文字セットの需要が高まりました。

1