Python文字列と符号化

4548 ワード

1.文字コードの紹介
文字列もデータ型ですが、文字列が特殊なのは符号化の問題です.
コンピュータは数字しか処理できないので、テキストを処理するには、まずテキストを数字に変換してから処理しなければなりません.最初のコンピュータは設計時に8ビット(bit)を1バイト(byte)として採用したので、1バイトで表すことができる最大の整数は255(バイナリ11111111=10進255)であり、より大きな整数を表すにはより多くのバイトが必要である.例えば、2バイトで表すことができる最大整数は65535であり、4バイトで表すことができる最大整数は4294967295である.
コンピュータはアメリカ人が発明したので、最初は127文字しかコンピュータに符号化されていませんでした.つまり、大文字、数字、いくつかの記号です.この符号表はASCII符号化と呼ばれています.例えば、大文字Aの符号化は65で、小文字zの符号化は122です.
しかし、中国語を処理するには明らかに1バイトでは足りず、少なくとも2バイトが必要であり、ASCII符号化と衝突することはできないため、中国はGB 2312符号化を制定し、中国語を編入するために使用している.
あなたが考えることができるのは、世界中に百種類以上の言語があり、日本は日本語をShiftに編んでいます.JISでは、韓国が韓国語をEuc-krに編み込むと、各国の基準があり、衝突が避けられない結果、多言語混在のテキストに文字化けして表示される.
1.1 Unicode符号化
そのため、Unicodeは運に応じて生まれた.Unicodeはすべての言語を1つのコードに統一し、文字化けの問題はなくなります.
Unicode規格も発展していますが、最も一般的なのは2バイトで1文字を表すことです(非常に辺鄙な文字を使うには4バイトが必要です).現代のオペレーティングシステムとほとんどのプログラミング言語はUnicodeを直接サポートしています.
1.2 ASCII符号化とUnicode符号化の違い
(1).ASCII符号化は1バイトであり、Unicode符号化は通常2バイトである.(2).アルファベットAはASCII符号化で10進数の65、バイナリの01000001である.(3).文字oはASCIIで符号化され、10進数の48、2進数の0011000であり、文字'o'と整数0が異なることに注意する.(4).漢字はすでにASCII符号化の範囲を超えており、Unicode符号化は10進数の20013、バイナリの01001110 00101101である.
1.3 utf-8符号化
ASCII符号化されたAをUnicodeで符号化すれば、前に0を補うだけで済むと推測できますので、AのUnicode符号化は00000000 01000001です.新しい問題がまた現れた:Unicode符号化に統一すれば、乱符号化の問題はそれから消えた.しかし、あなたが書いたテキストが基本的にすべて英語であれば、Unicode符号化でASCII符号化よりも倍以上の記憶空間が必要で、記憶と伝送では非常にお得ではありません.そこで、節約の精神に基づいて、Unicode符号化を「可変長符号化」に変換するUTF-8符号化が登場した.UTF-8符号化は1つのUnicode文字を異なる数字の大きさによって1-6バイトに符号化し、よく使われる英語のアルファベットは1バイトに符号化され、漢字は通常3バイトで、辺鄙な文字だけが4-6バイトに符号化される.転送するテキストに英語の文字がたくさん含まれている場合は、UTF-8でエンコードするとスペースが節約されます.
1.4 Pythonの文字列ASCII Unicode utf-8の相互変換
Pythonの誕生はUnicode規格よりも早いため、最初のPythonはASCII符号化のみをサポートし、通常の文字列「ABC」はPython内部でASCII符号化されている.Pythonはord()とchr()関数を提供し、アルファベットと対応する数字を互いに変換することができます.
print ('A  ASCII  :{}'.format(ord('A')))
print ('65      :{}'.format(chr(65)))

Pythonは後にUnicodeのサポートを追加し、Unicodeで表される文字列はu'...'たとえば、次のように表示されます.
print u'  '
u'  '

u'にはu'u 4 e 2 d'と同じで、uの後ろには16進数のUnicodeコードが書かれています.したがって、u'A'とu'<41'も同じです.
2つの文字列はどのように相互に変換されますか?文字列「xxx」はASCII符号化であるがUTF-8符号化と見なすことができ、u「xxx」はUnicode符号化のみである.
u'xxx'をUTF-8符号化に変換する'xxx'をencode('utf-8')メソッドで使用します.
u'ABC'.encode('utf-8')
u'  '.encode('utf-8')

1.5まとめ
(1).Pythonは最初はASCIIのみをサポートしていたが、Unicode符号化の出現により、Unicodeに対するサポート逆ASCII符号化が追加された.大文字と小文字の英字、数字、いくつかの記号(2)逆ASCII符号化()=>ASCII符号化:ord('A')(3)ASCII符号化=>逆ASCII符号化:chr(65)(3)=>Unicode:u'中国語(4).Unicode=>utf-8:u'中国語'.Encode('utf-8')注意:英語文字変換後に表示されるUTF-8の値はUnicodeの値と等しい(ただし、占有する記憶空間は異なる)が、中国語文字変換後の1つのUnicode文字は3つのUTF-8文字になり、表示されるxe 4はそのうちの1バイトであり、その値は228であり、対応するアルファベットが表示されないため、16進数でバイトの数値が表示される.
1.6文字列の長さ
len()            :
len(u'ABC') #3 ASCII
len('ABC')#3 ASCII
len(u'  ')#2 utf-8
len('\xe4\xb8\xad\xe6\x96\x87')#6 Unicode
len('  ')#6 Unicode

1.7 UTF-8=>Unicode変換
逆にUTF-8符号化で表される文字列'xxx'をUnicode文字列u'xxx'に変換するにはdecode('utf-8')メソッドを用いる.
'abc'.decode('utf-8')

1.8ヘッダコードの追加
Pythonソースコードもテキストファイルなので、ソースコードに中国語が含まれている場合、ソースコードを保存する場合は、必ずUTF-8コードとして保存するように指定する必要があります.Pythonインタプリタがソースコードを読み込む場合、UTF-8コードで読み込むために、通常、ファイルの先頭にこの2行を書きます.
最初の行の注釈はLinux/OS Xシステムに伝えるためで、これはPython実行可能なプログラムで、Windowsシステムはこの注釈を無視します;
    #!/usr/bin/env python

2行目のコメントは、Python解釈器にUTF-8コードに従ってソースコードを読み取るように伝えるためです.そうしないと、ソースコードに書かれた中国語の出力が文字化けしてしまう可能性があります.
    # -*- coding: utf-8 -*-

注意:Notepad++を使用して編集する場合は、#--coding:utf-8を追加する以外に、中国語文字列はUnicode文字列でなければなりません.
1.9フォーマット出力
Pythonでは、C言語と一致するフォーマット方式が採用されており、%で実現されています.例えば、以下のようになります.
    %d    
    %f     
    %s     
    %x        

print ('Hello.%s' % 'world')
'Hello.%s' % 'world'

ここで、整数と浮動小数点数をフォーマットして、0と整数と小数の桁数を補うかどうかを指定することもできます.
'%2d-%02d' %(3,1)
'%.2f' % 3.1415926

何を使うべきか分からない場合は、%sは常に機能します.データ型は文字列に変換されます.Unicode文字列の場合、使い方はまったく同じですが、置換された文字列もUnicode文字列であることを確認したほうがいいです.
u'Hi,%s' % u'Michael'
'%s %s' % (25,True)

 %%     %:

'Earth\'s water accounts for only %s %% of the total water in Shanghai' % 7

詳細ファイル移動Python学習ノート