unicodeとutf 8符号化を徹底的に明らかにする

4288 ワード

文字列エンコーディング

コード発展過程

  • コンピュータは数字しか処理できず、テキストは数字に変換されてから処理できます.コンピュータの中の8 bitは1バイトであるため、1バイトで表すことができる最大の数字は255である.
  • コンピュータはアメリカ人が発明したものです.したがって、1バイトはすべての文字を表すことができるので、ASCII(1バイト)符号化はアメリカ人の標準符号化になります.
  • しかし、ASCIIは中国語を処理するのに明らかに足りない.中国語は255の漢字だけではないので、中国はGB 2312のコードを制定して、2バイトで1つの漢字です.GB 2312にはASCIIも含まれています.同じように、日本語と韓国語も同じです.しかし、標準がますます多くなると、複数の言語が混在して表示される場合、必ず文字化けしてしまいます.
  • はunicodeが現れ、すべての言語をコードに統一した.
  • 乱符号化の問題は解決したが、内容がすべて英語であれば、unicode符号化はASCIIより倍の記憶空間を必要とし、同時に伝送すれば倍の伝送
  • を必要とする.
  • だから可変長の符号化「utf-8」が現れ、英語を1バイト、漢字を3バイト長くした.特に辺鄙なプログラミングは4-6バイトで、大量の英語を伝送すればutf-8の役割が明らかになる.
  • ASCIIとunicode符号化比較||ASCII符号化|unicode符号化|バイナリ|——————————————————————————————————————||||0100 0001||漢字’のうち「|ASCII符号化の範囲を超えている|20013|01001110 00101101|A unicode||unicode符号化を使用するには、前に0|00000000 0100|0001|
  • を補う必要がある

    コード変換


    python 3ではutf-8がデフォルトで符号化されています
    >>> x = " Python"
    >>> x.encode("utf-8")
    b'\xe6\x88\x91\xe7\x94\xa8Python'
    >>> 
    
    >>> import sys
    >>> sys.getdefaultencoding()
    'utf-8'
    >>> 
    

    python 2ではASCIIがデフォルトで符号化されています
    >>> s = " Python"
    >>> s.encode("utf8")
    Traceback (most recent call last):
      File "", line 1, in <module>
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
    >>> 
    
    >>> import sys
    >>> sys.getdefaultencoding()
    'ascii'
    >>> 
    

    符号化問題はPython 2とPython 3の最大の違いであり、符号化問題を理解することはPythonを本当に把握するのに重要な役割を果たす.