UnicodeとUTF - 8



ロングストーリー
1960年代には、あなたがキーを入力するテレプリンターと簡単な装置がありました、そして、それは数のコレクションを送ります、そして、同じ手紙は向こう側に出てきます.しかし、それは非標準的な解決であったので、1960年代半ばに、アメリカ  は情報交換(ASCII)のためにアメリカの標準コードに定住しました.
それは7ビットのバイナリシステムです.任意の番号を入力する7のバイナリ番号に変換され、送信されます.
一言で言えば、それはあなたからの数字を持つことができることを意味します0 to 127 .
(64) (32) (16) (8) (4) (2) (1)
  0    0    0   0   0   0   0 = 0
  1    1    1   1   1   1   1 = 127
ここでは、彼らは巧妙なことをした興味深い点.A このシステムでは65 , バイナリ1000001 :
1000000 = 64
0000001 = 1

A = 64 + 1 = 1000001
見ましょうB and C :
B = 1000010
C = 1000011
ここでは、ハックの場合は、最初の2桁をオフにノックすることができますし、そのアルファベットの位置は知っている.小文字の場合、32 番号を後でa :
a = 97 = 1100001
そして、それは英語を話す世界のための標準になりました.

新しい日新しい問題
すべてのアルファベットを持っていない言語についてはどうですか?彼らはすべて自分のコード化を付属しています.しかし、新しい日と新しいコンピュータが来る.8ビットコンピュータに移動します.だから今、我々は7ビットでエンコードするすべての文字の開始時に全体の余分な番号を考え出す必要があります!
しかし、この時点で誰も同じ基準に達しませんでした.日本は独自のマルチバイト符号化を行い、個々の文字に対してより多くの文字とより多くのバイナリを作成します.それで、この点から、すべてはひどく不適合になり始めました!
しかし、ほとんどの場合、そのような問題を持っていない場合は、単にドキュメントを印刷し、それをファックス.そして、世界中のウェブがヒットし、問題文書が世界中に送られる.そしてここに移動しましょうUnicode Consortium .

救助へのユニコード
Unicodeは、おそらく任意の言語で(たとえそれが絵文字の言語である場合でも)書くことができるすべてをカバーする😃). その結果、我々はUnicode Consortium 100000の数字に100000 +文字を割り当てる.彼らはどんなバイナリ表現もしない彼らは言った.hey, that Japanese character, that is number 5700 and this Cyrillic character is 1000-something .

Unicode規格について
それでUnicode , 次の用語で動作します.Abstract character - テキストデータの組織、コントロール、または表現に使用される情報の単位です.
Unicodeは文字を抽象語として扱う.すべての抽象文字には、関連付けられた名前、例えばラテンの小さな文字Aがありますa .Code point - は単一の文字に割り当てられた数です.
コードポイントはU+0000 to U+10FFFF .U+<hex> はU +がUnicodeを意味する接頭辞であるコードポイントの形式です<hex> は16進数である.例えば、U+0041 and U+2603 はコードポイントです.
コードポイントが単純な数値であることを忘れないでください.そして、それはあなたがそれについて考えるべき方法です.コードポイントは、配列の要素のインデックスの一種です.
マジックは、Unicodeがコードポイントを文字で関連付けるために発生します.例えばU+0041 ラテン語文字Aという文字に対応するA ), or U+2603 雪だるまという文字に対応する☃).
すべてのコードポイントに関連文字がありません.1,114,112 コードポイントは利用可能ですU+0000 to U+10FFFF ), でも、137,929 (2019年5月現在)文字を割り当てている.Code unit - 与えられた符号化形式内の各文字をエンコードするために使用されるビットシーケンスです.
文字エンコーディングは、抽象的なコードポイントを物理ビットに変換するコードです.言い換えると、文字符号化はユニコードコードポイントをユニークなコード単位シーケンスに翻訳します.

UTFとは
私たちの知る限りではUnicode まず、文字のコードポイントの表を定義します.それは65のための65のスタンド、Bのための66のスタンド、および9731☃これらのコードポイントが実際にどのようにビットにコード化されるかは、関連する異なった話題ですUTF encoding .

UTFが解決する問題
エンコード100000文字については、少なくとも17(2 ^ 17〜100000)の2進数をエンコードする必要がありますが、英語のアルファベットは全く同じ(バック互換性のために)する必要がありますA 静止する65 . それで、あなたがちょうど英語のテキストのストリングを持っているならば、あなたはそれをコード化しています32 ビット文字単位.それで、あなたは27 ゼロといくつかの情報だけで.これは非常に無駄です.それで、すべての英語のテキストファイルは、ディスク上でスペースをとる必要があります.
要約
  • 問題1.英語のテキストですべてのゼロを取り除く.
  • 問題2.8つのゼロを行として、NULLとして解釈する多くの古いコンピュータがありますthis is the end of the string characters . それで、あなたが列に8つのゼロを送るならば、彼らはちょうど聞くのを止めます.それで、あなたは至る所で8つのゼロを持つことができません.
  • 問題3 .それは後方互換性があります.あなたがシステムに送られるならばUTF エンコードされた文字列ASCII あなたはまだ有効な英語のテキストを取得する必要があります.

  • このような問題を解決する方法
    それはちょうど使用を開始するにはASCII あなたが下にあるならば128 , として表現することができます7 数字.それでUTF-8 A エンコードは同じです:
    A = 01000001 = 65
    
    だからまだUTF and ASCII 有効です.今、その上に行きましょう、そして、あなたが覚えているようにASCII . 次のヘッダを使用します.110 - 新しい文字ヘッダの開始は2バイトです.バイト8 登場人物10 - 継続を意味する
    では、例を見てみましょう.
     __________________________ ______________________________________
    |                          |                                      |
     110         x x x x x       10                    x x x x x x
    (the stater) (5 characters)  (continuation header) (6 characters)
    
    だから今だけですべての数字を取ることができるヘッダーを除外し、あなたが得る
    x x x x x = 5 characters
    x x x x x x = 6 characters
    
    0 0 1 1 0 <> 1 1 0 0 1 0 = 434
    
    しかし、その上にどうですか?
    あなたは行く1110 あなたが持っていることを意味する開始ヘッダー3 バイト.1つのヘッダと2つの継続ヘッダ:
     _________________ __________________ ________________
    |                 |                  |                |
     1110 x x x x       10  x x x x x x    10 x x x x x x
    
    それで、あなたは行くことができて、より高い仕様さえ行きます1111110x . それで、このハックは無駄を避けます、それは後方互換性がありません、そして、ポイントはこれまでに8つのゼロを列に送りました.

    最下部
    投稿を読んでくれてありがとうございます.何か質問があれば以下のコメントを書く自由.私は、私が簡素化の多くを加えたということを知っています、しかし、私は彼らを修理する準備ができています.
    質問をしたり、意見を述べたり、意見を述べたりしてください.戦争ではなくコードを作る.❤️