Python エンコード処理 - str と Unicode

高洛峰
リリース: 2017-02-27 10:02:34
オリジナル
1266 人が閲覧しました

STR と UNICODE に関する優れた記事

Python コーディングに関連するコンテンツを整理します

注: 以下の説明は、ファイルやメッセージ、http パラメーターなどの取得に関するものです。

実行するとすぐに、文字化けが見つかります (文字列の処理、ファイルの読み取りと書き込み、印刷) そして、ほとんどの人が行うことは、文字化けが表示される理由を明確に考えずに、デバッグのためにエンコード/デコードを呼び出すことです

したがって、デバッグ時に最も一般的なエラーは次のとおりです。

エラー 1

トレースバック (最後の呼び出し): ファイル ""、 行 1、UnicodeDecodeError: 'ascii' コーデックは位置 0 のバイト 0xe6 をデコードできません: 序数範囲内ではありません(128)

エラー 2

トレースバック (最新の呼び出しは最後): ファイル ""、行 1、 ファイル "/System/Library/Frameworks/" Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py"、16 行目、デコードで codecs.utf_8_decode(input,errors,True) が返されます UnicodeEncodeError:「ascii」コーデックは正しい位置で文字をエンコードできません0-1: 序数が範囲外です(128)

まず第一に
文字セットと文字エンコーディングを理解する必要があります

Unicode | WaitCharacterエンコードに関する注意点: ASCII、Unicode、UTF-8

淘宝網検索技術ブログ - 中国のコーディングの話

strとunicode

strとunicodeはどちらもbasestringのサブクラスです

ので、それがbasestringであるかどうかを判断する方法がありますstring

def is_str(s): 戻り isinstance(s,basestring)

str と Unicode 変換

ドキュメントをデコード
ドキュメントをエンコード

str -> decode(' the_coding_of_str') - > ユニコードunicode -> encode('the_coding_you_want') -> str

Difference
str は、Unicode でエンコードされたバイトで構成されるバイト文字列です

宣言メソッド

s = '中国語' s = u'中文'.encode('utf-8') >>> type('中文')

長さを求める (バイト数を返す)

> >> u'中文'.encode('utf-8') 'xe4xb8xadxe6x96x87' >>> len(u'中文'.encode('utf -8')) 6

文字で構成される実際の文字列

宣言メソッド

s = u'中国語' s = '中国語'.decode('utf-8 ') s = unicode('中国語', 'utf-8') > ;>> type(u'中国語')

ロジックで実際に使用したいものの長さを調べます

> ;> u'中文' u'u4e2du6587' >>> len(u'中文') 2

結論
必要なことを理解する str であっても unicode であっても、正しいものを使用してください処理メソッド(str.decode/unicode.encode)

unicode/strかどうかを判定する方法は以下の通りです>>> isinstance(u'中文', unicode) True >>> isinstance('中文', unicode) False >>> isinstance('中文', str) True >>> isinstance(u'中文', str) False

単純な原則: 使用しないでくださいstr をエンコードし、unicode にはデコードを使用しないでください (実際、str をエンコードできます。詳細については最後を参照してください。簡略化するため、これはお勧めしません)

>>> utf-8') トレースバック (最新の呼び出しは最後): ファイル ""、行 1、 UnicodeDecodeError: 'ascii' コーデックは位置 0 のバイト 0xe4 をデコードできません: 序数が範囲内にありません( 128) >>> u'中文'.decode('utf-8') トレースバック (最新の呼び出し): ファイル ""、行 1、 ファイル "/System/" Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py"、16 行目、デコードで codecs.utf_8_decode(input、errors、True) が返されます UnicodeEncodeError: 'ascii' コーデックは使用できません位置 0-1 の文字をエンコードします: 順序は範囲 (128) にありません


さまざまなエンコード変換、中間エンコードとして Unicode を使用します

#s は str s.decode('code_A').encode('code_B' code_A )

ファイル処理、IDE、コンソール

処理プロセスはこのように使用できます。Python をプール、入口、出口として考えてください
入口では、すべてが Unicode に変換され、すべてがプール内のは Unicode を使用して処理され、終了時にターゲットのエンコーディングに変換されます (もちろん例外があり、処理ロジックでは特定のエンコーディングが使用されます)

ファイルの読み取り 外部入力エンコーディング、Unicode へのデコード 処理 (内部エンコーディング、統合 Unicode) 必要なターゲット エンコーディングへのエンコード ターゲット出力 (ファイルまたはコンソール) への書き込み

IDE とコンソールがエラーを報告しました。その理由は、印刷時に, エンコーディングが IDE 独自のエンコーディングと一致しないため、出力するときに、エンコーディングを一貫したものに変換すると、出力が正常になります。推奨事項

標準化されたエンコーディング

特定のリンクによって引き起こされるコードの文字化けを防ぐための統一されたエンコーディング

環境コーディング、IDE/テキストエディタ、ファイルエンコーディング、データベースデータテーブルエンコーディング

コードソースファイルのエンコーディングを確認する

これは非常に重要です

ソースコードファイルでは、ドキュメントを宣言するために非ASCII文字をファイルヘッダーでエンコードする必要がある場合、

宣言されていない場合は、ASCIIです。非 ASCII 文字を入力するときにエラーが発生しました。非 ASCII 文字はファイルの 1 行目または 2 行目に配置する必要がありますファイル "XXX.py"、行 3 SyntaxError : ファイル c.py の行 3 にある非 ASCII 文字 'xd6'、ただし、エンコーディングは宣言されていません。詳細については http://www.php.cn/ を参照してください。

宣言メソッド

# -*-coding: utf-8 -*- または #coding=utf-8

coding=utf-8、a = '中国語'を宣言、エンコーディングはutf-8です

ヘッダーがcoding=gb2312、a = '中国語'を宣言している場合、そのエンコーディングはgbk

soです同じプロジェクト内のすべてのソースファイルヘッダー。統一されたエンコーディングがあり、宣言されたエンコーディングはソース ファイルに保存されているエンコーディングと一致している必要があります (エディター関連)

はソース コード内で処理するためのハードコーディングされた文字列として使用され、その型を分離するために一律に unicode
を使用しますソースファイル自体のエンコーディングから独立しており、プロセス内のさまざまな場所での処理を容易にするための依存関係はありません

if s == u'中文': #Instead of s == '中文' pass #Note ここまで来たら、必ず Unicode に変換してください

上記の手順を完了したら、2 つの Unicode と設定したエンコーディング (通常は utf-8 を使用します) に注意するだけです

処理順序

1.どこでも Unicode 3. 後でエンコードする


関連モジュールといくつかのメソッド

>>> import sys >>> ;>> リロード (sys) <モジュール 'sys' (組み込み)> >>> sys.getdefaultencoding() utf-8'

str.encode('other_coding')

Pythonでは、特定のエンコーディングstrを別のエンコーディングに直接エンコードします str


#str_Aはutf-8 str_A.encode('gbk') 実行される操作はstr_Aです.decode('sys_codec').encode('gbk') ここで、sys_codec は前のステップ

「システムのデフォルトのエンコーディングを取得して設定する」の sys.getdefaultencoding() のエンコーディングであり、ここでの Encode が関係します。この方法で使用することはめったにありません。主な理由は、クリアなデコードを入力し、クリアなエンコードを出力する方が簡単だからです。 ;>>> f = open('test.txt','r') >>> 結果 = chartet.detect(f.read()) >>> {'confidence': 0.99, 'encoding': 'utf-8'}

u 文字列は、u' > で対応する Unicode 文字列に変換されます

>>> > ;> s = 'u4e2d' >>> で s.decode('unicode_escape') = '\u4fee\u6539\u8282\u72b6\u6001\u6210\u529f ' >>> a.decode('unicode_escape') u'u4feeu6539u8282u70b9u72b6u6001u6210u529f'

今後も関連情報を追加していきますのでよろしくお願いいたします。このサイトの!

その他の Python エンコード処理 - str および Unicode 関連の記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート