文字エンコーディングのメモ:ASCII、UnicodeとUTF-8
テンセント大学の教室のおかげNEXT後援サイト、テンセントの公式フロントエンドコース学ぶための無料トライアル。
正午今日では、私は突然、UnicodeとUTF-8との間の関係を知りたい、彼は情報を見つけるために始めました。
昼食は速報アウトと考えることが、21時を見てきた後に、この問題は、私が想像以上に複雑です。
ここに私のノートがあり、主に自分のアイデアを整理するために使用されます。私は他の友人に役立つことを期待して、理解しやすい記述してみてください。すべての後に、文字エンコーディングがしたいコンピュータ技術、コンピュータの熟練した使用の礎石である、あなたは文字エンコーディングの少しの知識を知っている必要があります。
、ASCIIコード
私たちが知っているように、内部のコンピュータは、すべての情報は、最終的にはバイナリ値です。各二進数字(ビット)を有し0
且つ1
二つの状態、従って8ビットバイト(バイト)と呼ばれる256個の状態を、組み合わせることができます。つまり、1バイトの合計256個の異なる状態、シンボルに対応する各状態を表すために使用されてもよく、それはから256個のシンボルである00000000
と11111111
。
前世紀の60年代には、米国では、文字エンコーディング、英語の文字とビットの間の関係のセットを開発した均一な規制をしました。これは、まだ使用され、ASCIIコードと呼ばれています。
ASCII符号化コードは、スペースとして、128文字の合計を提供するSPACE
32(バイナリ00100000
)、大文字はA
65(バイナリ01000001
)。(32個の制御シンボルをプリントアウトすることができないなど)128個のシンボルは、それだけには所定の均一の先頭1バイトの後ろ7をとります0
。
第二に、非ASCIIコード化
十分な128シンボル符号化と英語が、他の言語を表現するために、128個のシンボルは十分ではありません。たとえば、フランス語で、文字以上の発音記号があり、それはASCIIコードで表現することはできません。その結果、一部の欧州諸国は、新しいシンボルに組み込まれたアイドルの最上位バイトを使用することにしました。例えば、フランス語é
130(バイナリとしてコード化されました10000010
)。その結果、欧州諸国で使用される符号化方式は、最大256個の記号を表すことができます。
しかし、ここで再び、新たな問題があります。さまざまな国は、彼らがエンコーディングに256個のシンボルを使用している場合でも、文字は同じではありません表し、そのため、異なる文字を持っています。たとえば、フランス語のコーディングで130人の代表はé
、ヘブライ語でコーディングは文字を表しGimel
(ג
)、ロシアのコーディングに別のに代わって署名します。しかし、いずれにしても、すべてのこれらのコード、記号は0〜127が同じで表し、この段落では同じではありませんが、単に128--255です。
テキストのアジア諸国については、シンボルが千万漢字限り多く、さらに使用します。バイトは記号のみの256種類を表すことができ、それはあなたがシンボルを表現する複数のバイトを使用する必要があり、確かに十分ではありません。例えば、中国の簡略化された符号化は一般的GB2312で、文字の2つのバイトを使用するので、理論的には最大256×256 = 65536個のシンボルを表します。
中国のコーディングの問題は特別なニーズを議論し、このノートは含まれません。ここでの唯一のシンボルが複数のバイトが、文字コードで表されているが、以下GBクラスは、Unicode UTF-8と無関係であることに留意。
三。ユニコード
前節で述べたように、二進数で、世界をコードする様々な異なるシンボルとして解釈することができるあります。そのため、テキストファイルを開くために、あなたはエンコーディングを知っているか、間違ったエンコーディングを読み込む必要があり、それが文字化けします。なぜ電子メールは、多くの場合、文字化け?送信者と受信者の使用をコードする同じではありませんので。
コードがあれば、世界のすべてのシンボルが含まれている、想像してみてください。各シンボルは、ゴミ問題が消え、固有のコードを与えています。これはその名の通り、これはシンボルのすべてのエンコードである、と述べている、Unicodeです。
Unicodeは確かに百万人以上のシンボルを収容することができ、その現在のサイズの大きなコレクションです。各シンボルをコードする異なる場合、例えば、U+0639
アラビア文字を表しAin
、U+0041
英語での大文字をA
、U+4E25
中国の文字を表し严
。特定のシンボルの対応表を照会することができるUnicode.org、または特殊文字対応表を。
四、Unicodeの問題
これは、Unicodeが、それが唯一のバイナリ表記を提供していますが、これはバイナリコードに格納する方法を指定しません、記号のセットだけで、注意すべきです。
例えば、中国語の文字严
のUnicodeの16進数である4E25
2進数に変換され、完全な15( 100111000100101
)、つまり、このシンボルは、少なくとも2つのバイトを表します。他の記号は、3バイトまたは4バイト、またはそれ以上を必要とするかもしれない、より大きな表します。
ここでは、2つの重大な問題は、最初の質問は、ありますが、どのようにすることができますUnicodeとASCIIの違いは?コンピュータは3つのバイトは3つのシンボルがそれを表しているのではなく、シンボルを表す方法を知っていますか?第二の問題は、我々はすでに知っている、1バイトのみで十分である文字は、Unicodeの統一規制場合、各記号は3または4バイトで表現され、各文字の前に2のためにバインドされていることです3バイト0
のストレージのための偉大な廃棄物で、テキストファイルのサイズが大きくなりますので、2〜3回に、これは容認できません。
それらが引き起こす結果は:1)多くの異なるバイナリフォーマットが存在する記憶手段ユニコードの種々の出現は、Unicode文字を表すために使用することができます。2)Unicodeは、インターネットの登場まで、時間の長い期間を促進することはできません。
五、UTF-8
インターネットの普及は、統一されたコーディングが表示されます促しました。UTF-8は、インターネット上でUnicodeを使用して最も広く使用されている実装です。他の実装は、さらに、実質的にはないインターネット上で、UTF-16(文字2バイトまたは4バイト)、およびUTF-32(文字で表される4バイト)を含みます。繰り返しますが、ここで関係、UTF-8 Unicodeは、実装の一つです。
UTF-8の最大の特徴は、可変長符号化であるということです。これは、バイト長がシンボルによって異なり、一つのシンボルの1〜4バイトであることができます。
UTF-8エンコーディング規則は、2つだけの非常にシンプルです。
1)単一バイト・シンボルについて、最初のバイトが設定され0
、Unicodeコードシンボルの後ろ7。そのため、英語のアルファベットのため、UTF-8エンコーディングとASCIIコードは同じです。
2)についてはn
バイト記号(n > 1
)最初のバイトの前に、n
ビットがセットされ1
、n + 1
ビットがセットされ0
、最初の2つのバイトは常にバックセット10
。残りのビットは、Unicodeコードシンボルの全てを言及していません。
次の表は、符号化規則、文字要約x
符号化されたビットで表現します。
Unicodeのシンボル範囲| UTF-8エンコーディング (16進数)|(バイナリ) -------- + -------- ------------------------------------- 0000 0000-0000 007F | 0xxxxxxx 0000 0080から0000 07FF | 10xxxxxxに110xxxxx 0000 0800から0000 FFFF | 1110xxxx 10xxxxxxに10xxxxxxに 0001 0000から0010 FFFF | 11110xxx 10xxxxxxに10xxxxxxに10xxxxxxに
これは、UTF-8エンコーディングを読んだことは非常に簡単で、テーブルの上に今あります。最初のものはバイトであれば0
、これはシングルバイト文字であり、最初の1である場合は1
、その後、連続した数が1
、それは現在の文字によって占有バイト数を示します。
以下に、または漢字で严
、例えば、UTF-8エンコーディングを実装する方法を示します。
严
ユニコードは、4E25
( 100111000100101
)の表に従って、求めることができる4E25
第三の行(の範囲内で0000 0800 - 0000 FFFF
)、したがって严
UTF-8エンコーディングは3バイト、すなわち、フォーマットを必要とします1110xxxx 10xxxxxx 10xxxxxx
。その後、から严
スタートの最後のビット、後ろから前にフォームに記入しx
、余分なビットを構成しています0
。このようにして得られた、严
コードをUTF-8で11100100 10111000 10100101
、16進数に変換されますE4B8A5
。
6間の変換、UnicodeのUTF-8で
前節の例により、我々が見ることができる严
コードがUnicodeである4E25
、UTF-8エンコードされE4B8A5
、両者は同じではありません。それらの間の遷移は、プログラムによって実現することができます。
Windowsプラットフォームでは、単純な変換方法がある組み込みのメモ帳アプレットを使用することですnotepad.exe
。ファイルを開いたら、をクリックして文件
、メニューの另存为
コマンドがあり、下部にあるダイアログボックスをポップアップ表示されます编码
ドロップダウンバー。
あり4つのですANSI
:オプションはUnicode
、Unicode big endian
とUTF-8
。
1)ANSI
デフォルトのエンコーディングです。英語のファイルがされているためにASCII
エンコードされた簡体字中国語のファイルがさのために、GB2312
エンコードされた(Windowsのみ簡体字中国語版のために、それがある場合には、繁体字中国語Big5のコードを使用します)。
2)Unicode
ここで符号化を指すnotepad.exe
、すなわち、直接2バイトのUnicode文字に使用されるUCS-2エンコーディング、リトルエンディアン形式でこのオプション。
3)Unicode big endian
対応するオプションをコードします。私は、次のセクションビッグエンディアンとリトルエンディアンの意味で説明します。
4)UTF-8
符号化は、符号化が議論方法があります。
「コード」を選択した後、ファイルがすぐに良く変換するエンコード、「保存」ボタンをクリックします。
七、リトルエンディアンとビッグエンディアン
既に前のセクションで述べたように、UCS-2フォーマットは、(コードポイントを超えないUnicodeコードを格納することができます0xFFFF
)。漢字严
の例は、Unicodeコードは、4E25
2バイト、1つのバイトを使用する必要性4E
、他のバイト25
。保存した場合、4E
前者は、25
記事で、これはビッグエンディアンモードであり、25
前者は、4E
記事で、これはリトルエンディアンモードです。
2人の奇数名前は英国の作家ジョナサン・スウィフトのから来て「ガリバー旅行記。」本では、内戦のリリパットの流行は、戦争は、それがバルク(ビッグエンディアン)や小さな頭部からノックされているかどうか、議論の原因である(リトルエンディアン)の卵を食べてノックしました。戦争が6回勃発する前と後に、この問題に、皇帝は彼の人生を失った、他の皇帝は彼の王座を失いました。
最初のバイトは最初、「バルクモード」(ビッグエンディアン)、第一、第二のバイトは、「ヘッドモード」(リトルエンディアン)です。
だから、当然、問題があるでしょう:あなたはどのようにエンド使用してエンコードされたファイルの種類でコンピュータを知っていますか?
Unicode仕様の定義は、各ファイルの先頭を順次この文字の名前の文字コード表現に追加される「ゼロ幅改行なしスペース」(ゼロ幅ノーブレークスペースと呼ばれる ) ですFEFF
。これは、正確に2バイトで、FF
よりFE
大きな1
。
最初の2つのバイトはテキストファイルである場合FE FF
、それはファイルがバルクモードであることを示し、最初の2バイトである場合FF FE
、それはファイルが小さいヘッドの実施の形態であることを意味します。
八例
ここで、例えば。
「メモ帳」プログラムを開きnotepad.exe
、新しいテキストファイル、コンテンツがある严
の使用に続いて、単語ANSI
、Unicode
、Unicode big endian
およびUTF-8
エンコードが保存さ。
その後、テキストエディタを使用してウルトラエディットを「六角機能、」ファイルの内部エンコーディングを観察します。
1)ANSI:エンコードされたファイルは2バイトでD1 CF
あり、严
符号化GB2312、GB2312これは、バルクの使用が格納されていることを意味します。
2)ユニコード:4つのバイトコードFF FE 25 4E
、FF FE
小さなヘッドを格納することを示しているが、実際の符号化があります4E25
。
3)ユニコードビッグエンディアン:4つのバイトをコードするFE FF 4E 25
、FE FF
大部分が格納されていることを示します。
4)UTF-8エンコーディングは、6つのバイトでEF BB BF E4 B8 A5
最初の3つのバイトは、EF BB BF
3つ、これはUTF-8エンコーディングであることを示しE4B8A5
ている严
特定のコード配列およびそのコード配列は同じに格納されています。
IX深い読み
- 。絶対に、ポジティブについてUnicodeと文字セットを知っている必要がありますでの絶対最小すべてのソフトウェア開発(文字セットの基本的な知識)
- Unicodeエンコーディングについて話をします
- RFC3629:UTF-8、ISO 10646のフォーマット変換(UTF-8の場合、所定の達成)
(終わり)