python 3でコードについて

2371 ワード

Unicodeとutf-8の符号化問題はpython 3でより際立っている.Python 3にはbytesタイプが追加され、stringタイプはデフォルトでunicodeで符号化されています.

ASCIIコードから


コンピュータが発明されたばかりの頃、アメリカ人の26の英語のアルファベットに数字、句読点、数学の記号、その他の特殊な記号を加えて、1つのバイトですべて符号化することができて、つまり0000から1111 1111まで、10進数は0から255までで、全部で256文字を表すことができて、1文字ごとに1バイトです.このコードはASCIIコードと呼ばれ、アメリカの国家標準コードです.しかし、コンピュータの普及に伴い、世界の多くの国、多くの言語がASCIIで符号化されると、明らかに足りない.わが国はGB 2312符号化を提案し、2バイトで漢字を符号化したが、その上でGBK、GB 13000を拡張した.1,GB 18030などの符号化.これは中国本土の簡体字コード、繁体字のBIG 5コード、そして日本のSHIFT_JISコード、韓国のEuc-krコード、ロシアの、アラブの、スペインの......自然と、世界のどの言語も含めて、すべての言語の基本単位に唯一のコードを割り当てることができる汎用コードが考えられます.この共通のコードはUnicodeコードと呼ばれ、中国語では「統一コード」と訳されています.

Unicodeコード


Unicodeはずっと発展していて、最もよく使われているのは2バイトで1文字を表して、辺鄙なのは4バイトです.このように、英語、中国語、日本語、韓国語を含む様々な言語を1つのコードで表すことができ、問題は解決したように見えますが、事実は残酷です.文字ごとに2バイトで符号化され、英語以外の国の文字符号化の問題は解決されたが、英語圏の人々は損をしたと感じている.1バイトで解決できることを2バイトで解決しなければならないからだ.これは、ハードディスクに格納する際に倍以上の記憶空間が必要であり、ネットワーク上で転送する際にも倍以上の記憶空間が必要であることを意味し、これはあまりにもお得ではない.従って,Unicode符号化は出現すると理論的な符号化となり,具体的な応用では多様な実現方式がある.その中で最もよく使われるのがUTF-8符号化です.

UTF-8エンコーディング


UTF-8符号化は「可変長」の符号化とも呼ばれ、その原理は、各言語に対応する数字によってそれぞれ異なるバイトで記憶され、英字は1バイトで符号化され、中国語は3バイトで符号化され、辺鄙な文字は4-6文字で符号化される.これにより、ASCII符号化はUTF-8符号化に無痛に溶け込み、英語の国の記憶空間の倍以上の問題を解決した.

コード変換


コンピュータメモリではUnicode符号化を統一的に使用し、ハードディスクに保存したり、ネットワーク上で伝送したりする場合、英語の国はASCII形式に符号化することができ、非英語の国はコスト国の自家製フォーマット(例えば、わが国のGB 2312コード)を符号化することができ、逆に、コンピュータのハードディスク上のテキストやネットワーク上で伝送されるテキストには異なる符号化方式がある可能性がある.ただし,コンピュータメモリで操作するにはUnicode符号化に変換して処理し,保存する際には異なる符号化方式を選択して符号化することもできる.Unicodeを人にたとえると、彼は異なる国に異なる名前を持っているかもしれないが、この人はずっとこの人だ.

Python3.Xのstrとbytes


python 3の文字列はデフォルトでUnicodeで符号化されています.これは、
 ='china'

このようなフォーマットも許可されています.Python 3では、文字列を作成すると、デフォルトの符号化はUnicodeであり、ハードディスクに保存したり、ネットワーク上で伝送したりするにはbytes形式に符号化する必要があります.Python 3が持参したstr.encode(‘utf-8’)法を利用して、文字列strをutf-8形式に符号化することができます.もちろん、gb 2312、gbk形式に符号化することもできます.逆に、テキストファイルを開くと、私たちが読んだデータはbytes形式で、それは任意の符号化である可能性があります.私たちはどの符号化で開くかを指定する必要があります.このプロセスは復号化になります.通常utf-8フォーマットで復号し、pyhotn 3が持参するbytes()を利用する.decode(‘utf-8’)メソッド.

文字数

  • Unicode符号化では、文字単位でカウントするときに1文字が1、len(’中国’)=2、len(‘abc’)=3となる.
  • utf-8符号化では、バイト単位でカウントする場合、文字が占めるバイト数に依存し、len(‘中国’)=6、len(‘abc’)=3