Python のリテラル オブジェクト
Python 3.x でテキストを処理するオブジェクトには、str、bytes、bytearray が含まれます。
bytes と bytearray は、書式設定 (format、format_map) といくつかの特別な Unicode ベースのメソッド (casefold、isdecmal、isidentifier、isnumeric、isPRintable、encode) に使用されるメソッドを除く、ほぼすべての str メソッドを使用できます。
bytes にはシーケンスを通じて文字列を構築できるクラスメソッドがありますが、このメソッドは str では使用できません。
>>> b = bytes.fromhex('E4 B8 AD')
>>> b
b'xe4xb8xad'
>>>
'中'
>>> str(b)
"b'\xe4\xb8\xad'"
Unicode と文字変換
ord を通じて Unicode コードポイントを文字に変換するには chr を使用します逆の操作を実行できます。
>>> ord('A')
>>> ord('中')
20013
'A'
>> '中'.encode('utf-8')
b'xe4xb8xad'
>>> len('中'.encode('utf-8')) #3 を含むバイト オブジェクトの長さを計算します整数文字
3
Python とエンコーディング
Python が内部でエンコーディングを処理する方法
Python が入力を受け入れると、常に最初に Unicode に変換されます。そして、このプロセスは早ければ早いほど良いのです。
その後、Python の処理は常に Unicode で実行され、エンコード変換は実行されません。
Python が結果を返すときは、常に Unicode から必要なエンコーディングに変換されます。そして、このプロセスは遅ければ遅いほど良いのです。
Pythonのソースコードのエンコード方法
Pythonはデフォルトでutf-8エンコードを使用します。
別のエンコーディングを使用して Python コードを保存したい場合は、各ファイルの最初または 2 行目にエンコーディング宣言を配置できます (最初の行が hash-bang コマンドによって占められている場合)# ‐*‐ コーディング: windows‐1252 ‐*‐
Python で使用されているコーディング
C:UsersJL>chcp #オペレーティング システムで使用されているコーディングを検索
>>> import sys, locale
>> > locale.getpreferredencoding() #これが最も重要です'cp936'
>>> my_file = open('cafe.txt','r')
>>>
'cp936'
>> isatty()、sys.stdin.isatty()、sys.stderr.isatty() #出力がコンソールであるかどうか(True、True、True)
>>> sys.stdout.encoding、sys .stdin。エンコーディング、sys.stderr.encoding #sys の標準制御フローがリダイレクトされるか、ファイルにダイレクトされる場合、エンコーディングには環境変数 PYTHONIOENCODING の値、コンソールのエンコーディング、または locale.getpreferredencoding( )、優先度は徐々に低くなります。
('cp936', 'cp936', 'cp936')
>>> sys.getdefaultencoding() #Python がバイナリ データを文字オブジェクトに変換する必要がある場合は、デフォルトでこの値を使用します。
'utf-8'
>>> sys.getfilesystemencoding() #Python を使用してファイル名 (ファイルの内容ではない) をエンコードまたはデコードする場合、このエンコーディングがデフォルトで使用されます。
'mbcs'
上記は Windows でのテスト結果です。GNU/linux または OSX の場合、結果はすべて UTF-8 です。
mbcs と utf-8 の違いについては、http: / /stackoverflow.com/questions/3298569/difference-between-mbcs-and-utf-8-on-windows
ファイルの読み取りと書き込みのためのエンコーディング
>>>pen('cafe.txt',' w' ,encoding='utf-8').write('café')
4
>>> fp = open('cafe.txt','r')
>>> read( )
'caf Mao'
'cp936'
>>> open('cafe.txt','r', encoding = 'cp936') )
>>> open('cafe.txt','r', encoding = 'latin1').read()
'café'>>> (' カフェ.txt','r'、エンコーディング = 'utf-8')
>>> fp.encoding
'utf-8'
上記の例からわかるように、別のマシンで実行すると予期しない問題が発生するため、デフォルトのエンコーディングは決して使用しないでください。
Python が Unicode からの問題を処理する方法
Python は常に、コード ポイントを介して文字列のサイズ、または文字列が等しいかどうかを比較します。
Unicode でアクセント付き記号を表すには 2 つの方法があり、1 バイトで表す方法と、基本文字とアクセント付き記号で表す方法があります。Unicode では、これらは同じですが、Python ではコード ポイントがサイズの比較に使用されるため、同じではありません。もう平等。
>>> c1 = 'カフェu0301'
>>> c1 == c2
False
>>> len(c2)
(5, 4)
NFC (正規化形式正規構成): 標準の同等の方法で分解し、標準の同等の方法で再組み立てします。シングルトンの場合、再構成結果が分解前と異なる場合があります。文字列全体の長さをできる限り短くして、「eu0301」の 2 バイトが 1 バイトの「é」に圧縮されるようにします。
NFD (正規化形式正規分解): 標準的な同等の方法で分解します。
NFKD (正規化形式互換性分解): 互換性のある同等の方法で分解します。
NFKC (正規化形式互換性合成): 互換性のある同等の方法で分解し、再組み立てします。標準同等品を使用します。
NFKC および NFKD はデータ損失を引き起こす可能性があります。
>>> c3 =normalize('NFC',c1) #文字列長を短くする方向のc1操作
>>> len(c3)
4
> >> c3 == c2
>>> c4 = 正規化('NFD',c2)>>> len(c4)
;> c1
True
西洋のキーボードは通常、可能な限り短い文字列を入力するため、結果は「NFC」と一致しますが、「NFC」で操作して文字列が等しいかどうかを比較する方が安全です。また、W3C は「NFC」の結果を使用することを推奨しています。
Unicode では、同じ文字に 2 つの異なるエンコーディングがあります。
>>> o2 = 'u03a9'
>> o1, o2
> > o1 == o2
>>> 名前(o1)、名前(o2)
>>> NFC',o1)
>>> name(o3)
'ギリシャ大文字オメガ'
>>> o3 == o2
別の例は
>>> u1 = 'u00b5'
>>> u2 = 'u03bc'
>>> u1,u2
('µ', 'µ')
('MICRO SIGN', 'ギリシャ小文字 MU')
>>> u3 = Normalize('NFKD',u1)>>> name(u3)
'ギリシャ小文字MU '
別の例
>>> h1 = 'u00bd'
>>> h2 = 正規化('NFKC',h1)
>>> h1, h2
(' ½', '1⁄2')
(1, 3)
大文字と小文字を区別しない比較を使用したい場合があります
str.casefold の使用方法() の場合、このメソッドは比較のために大文字を小文字に変換します。たとえば、「A」は「a」に変換され、「MICRO SIGN」の「μ」は「GREEK SMALL LETTER MU」の「μ」に変換されます。
ほとんど (98.9%) の場合、str.casefold() と str. lower() の結果は一貫しています。
テキストの並べ替え
言語ルールが異なるため、コードポイントを比較する Python の方法に単純に従うと、ユーザーが期待するものと異なる結果が多数発生します。
>>> ロケールをインポートします
>>> locale.setlocale(locale.LC_COLLATE,'pt_BR.UTF-8')
>>> sorted(inial, key = locale.strxfrm)
Python ソースコードでデコードエラーが発生した場合、SyntaxError 例外が生成されます。
その他の場合、エンコードおよびデコードのエラーが見つかった場合は、UnicodeEncodeError および UnicodeDecodeError 例外が生成されます。
流暢なPythonから取られたいくつかの便利なメソッド
from unicodedata import 正規化、結合
def nfc_equal(s1, s2):
''''「NFC」での正規化後に文字列 s1 が文字列 s2 と等しい場合に True を返します''''
return Normalize("NFC",s1) = = Normalize("NFC",s2)
deffold_equal(s1, s2):
''return 「NFC」および casefold() での正規化後に文字列 s1 が文字列 s2 と等しい場合に True を返します'''
return Normalize( 'NFC',s1).casefold() ==normalize('NFC',s2).casefold()
def shave_marks(txt):
''''すべての発音記号を削除します
基本的には、ラテン語のテキストを次のように変更するだけです。純粋な ASCII ですが、この関数はギリシャ文字も変更します
shave_latin_marks の下の関数はより正確です'''
normal_txt = Normalize('NFD',txt)
shaved = ''.join(c for c innormal_txt if not Combin( c))
return Normalize('NFC',shaved)
def shave_latin_marks(txt):
''ラテン語の基本文字から発音区別符号をすべて削除します''
normal_txt = Normalize('NFD',txt)
keeper = []
latin_base=False
for c innormal_txt:
if combing(c) and latin_base:
続行 #ラテン文字ベースの発音記号を無視します
keeper.append(c)
#文字を組み合わせていない場合は、 new Base char
combining(c) でない場合:
latin_base = c in string.ascii_letters
これは Python の標準模倣です。 .csdn。 net/tcdddd/article/details/8191464
以上は python に与る内容です、より多くの関連文章请关注PHP中文网(m.sbmmt.com)!