pythonラーニングチュートリアル(3)--文字コード

4232 ワード

ASCII、UnicodeとUTF-8の連絡と区別


1. ASCII


127文字がコンピューターに組み込まれ、1バイト

2. Unicode


ASCIIは英語の文字にほかならないので、各言語で自分の基準をカスタマイズし、文字化けしの問題が発生します.Unicodeはすべての言語を1つのコードに統一し、文字化けの問題はなくなります.最もよく使われるのは、1つの文字(非常に辺鄙な文字を使用するには4バイトが必要)を2バイトで表す母AがASCIIで符号化されるのは10進数の65、バイナリの01000001である.文字0はASCIIで符号化され、10進数の48、2進数の0011000であり、文字'0'と整数0が異なることに注意する.漢字はすでにASCII符号化の範囲を超えており、Unicode符号化は10進数の20013、2進数の01001110 00101101である.ASCII符号化のAをUnicode符号化するには、前に0を補うだけでよいので、AのUnicode符号化は00000000 01000001

3. UTF-8


Unicodeコードに統一されると、文字化けの問題はなくなります.しかし、あなたが書いたテキストが基本的にすべて英語であれば、Unicode符号化でASCII符号化よりも倍以上の記憶空間が必要で、記憶と伝送では非常にお得ではありません.Unicode符号化を「可変長符号化」に変換するUTF-8符号化が出現した.UTF-8符号化は1つのUnicode文字を異なる数字の大きさによって1-6バイトに符号化し、よく使われる英語のアルファベットは1バイトに符号化され、漢字は通常3バイトで、辺鄙な文字だけが4-6バイトに符号化される.もしあなたが伝送するテキストに大量の英語の文字が含まれているならば、UTF-8で符号化すると空間を節約することができます:ASCII符号化は実際にUTF-8符号化の一部と見なすことができます.

現在、コンピュータシステムで一般的に使用されている文字コードの動作方法:


コンピュータメモリではUnicode符号化を統一し、ハードディスクに保存する必要がある場合や転送する必要がある場合はUTF-8符号化に変換する.メモ帳で編集する場合、ファイルから読み取ったUTF-8文字がUnicode文字に変換されメモリに変換され、編集が完了した後、保存するときにUnicodeをUTF-8に変換してファイルに保存されます.Webページを閲覧すると、サーバは動的に生成したUnicode内容をUTF-8に変換してブラウザに転送します.多くのページのソースコードには、このページがUTF-8符号化されていることを示す類似の情報があります.

Python文字列


Python 3のバージョンでは、文字列はUnicodeで符号化されています.つまり、Pythonの文字列は多言語をサポートしています.e.g print(' string')
Pythonはord()関数で文字の整数表現を取得し、chr()関数は符号化を対応する文字に変換する.
ord('A')結果:65 ord('中')結果:20013 chr(66)結果:'B'chr(25991)結果:'文'
文字の整数符号化は、strを16進数で書くこともできます.
print('u 4 e 2 du 6587')'中国語'
Pythonの文字列タイプはstrで、メモリにはUnicodeで表され、1文字は数バイトに対応しています.ネットワーク上で転送したり、ディスクに保存したりするには、strをバイト単位のbytesに変更する必要があります.Pythonはbytesタイプのデータをb接頭辞付きの単一引用符または二重引用符で表す:x=b'ABC'は「ABC」とb「ABC」を区別し、前者はstrであり、後者は前者と同じ内容を示しているが、bytesの各文字は1バイトしか占めていない.
>>> 'ABC'.encode('ascii')
b'ABC'
>>> ' '.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> ' '.encode('ascii')
Traceback (most recent call last):
  File "", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

純粋な英語のstrはASCIIでbytesと符号化することができ、内容は同じで、中国語を含むstrはUTF-8でbytesと符号化することができる.中国語を含むstrはASCIIで符号化できません.中国語の符号化の範囲がASCIIの符号化の範囲を超えているため、Pythonはエラーを報告します.bytesではASCII文字のバイトとして表示できず、x##で表示されます.ネットワークまたはディスクからバイトストリームが読み込まれると、読み込まれたデータはbytesです.bytesをstrにするにはdecode()メソッドが必要です.
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
' '

strに含まれる文字を計算するには、len()関数を使用します.
>>> len('ABC')
3
>>> len(' ')
2

len()関数はstrの文字数を計算し、bytesに置き換えるとlen()関数はバイト数を計算します.
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len(' '.encode('utf-8'))
6

Pythonソースコードもテキストファイルなので、ソースコードに中国語が含まれている場合は、ソースコードを保存する場合は、必ずUTF-8コードとして保存するように指定する必要があります.Pythonインタプリタがソースコードを読み込む場合、UTF-8コードで読み込むために、通常、ファイルの先頭にこの2行を書きます.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

最初の行の注釈はLinux/OS Xシステムに伝えるためで、これはPython実行可能なプログラムで、Windowsシステムはこの注釈を無視します;2行目のコメントは、Python解釈器にUTF-8コードに従ってソースコードを読み取るように伝えるためです.そうしないと、ソースコードに書かれた中国語の出力が文字化けしてしまう可能性があります.

書式設定


フォーマットされた文字列を出力するにはどうすればいいですか?出力は「親愛なるxxxこんにちは!あなたのxx月の通話料はxxで、残高はxx'のような文字列ですが、xxxの内容は変数によって変化しているので、文字列を簡単にフォーマットする方法が必要です.Pythonでは、フォーマット方式はC言語と一致し、%で実現される.例えば、%d整数%f浮動小数点数%s文字列%x 16進整数例1:
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'

例2:
>>> '%2d-%02d' % (3, 1)
' 3-01'
>>> '%.2f' % 3.1415926
'3.14'

例3:
s1 = 72
s2 = 85
r = (s2-s1)/s1 * 100
print('%.1f%%' % r)