ホームページ  >  記事  >  バックエンド開発  >  Pythonのエンコード処理におけるstrとUnicodeの違いと用途分析を詳しく解説

Pythonのエンコード処理におけるstrとUnicodeの違いと用途分析を詳しく解説

高洛峰
高洛峰オリジナル
2017-03-16 16:23:461350ブラウズ

pythonを使用して中国語を処理したり、ファイルを読み込んだりやメッセージを処理するとき、文字化けが見つかった場合(stringの処理、ファイルの読み書き、print)、ほとんどの人が行うことは、のencode/decodeを呼び出すことです。デバッグ中、文字化けが発生する理由を明確に考えていませんでしたが、今日はエンコードの問題に対処する方法について説明します。

注: 以下の説明は Python2 に関するものです。

ASCII | UTF-8 など。 unicode は両方ともベース

string

のサブクラスです。 したがって、それが string であるかどうかを判断する方法があります

def is_str(s): Return isinstance(s,basestring)

str と Unicode 変換

str -> decode('the_coding_of_str') -> unicode unicode -> encode('the_coding_you_want') -> str

差異

宣言メソッド

Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe6 in position 0: ordinal not in range(128)
(バイト数を返す)

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode     return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range(128)

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

宣言メソッド

>>> s = ‘中文‘ s = u‘中文‘.encode(‘utf-8‘)  
>>> type(‘中文‘) <type ‘str‘>
ロジックで実際に使用したいものの長さを調べます(文字数を返します)

>>> u‘中文‘.encode(‘utf-8‘) ‘\xe4\xb8\xad\xe6\x96\x87‘ 
>>> len(u‘中文‘.encode(‘utf-8‘)) 
6
結論

str が依然として Unicode である場合に対処する必要があることを理解し、適切な処理方法 (str.decode/unicode.encode) を使用します

以下は、Unicode/str であるかどうかを判断する方法です

>>> s = u‘中文‘ 
>>> s = ‘中文‘.decode(‘utf-8‘) 
>>> s = unicode(‘中文‘, ‘utf-8‘)  
>>> type(u‘中文‘) <type ‘unicode‘>
単純な原則: don str には encode を使用せず、unicode には decode を使用しないでください (実際、str をエンコードできます。詳細については最後を参照してください。簡単にするために、それはお勧めしません)

>>> u‘中文‘ u‘\u4e2d\u6587‘ 
>>> len(u‘中文‘) 
2
異なるエンコード変換、中間エンコードとして unicode を使用してください

>>> isinstance(u‘中文‘, unicode) True 
>>> isinstance(‘中文‘, unicode) False  
>>> isinstance(‘中文‘, str) True 
>>> isinstance(u‘中文‘, str) False

ファイル処理

、IDEとコンソール

の処理プロセスは、次のように使用できます。Pythonをプール、入り口、出口として考えてください

入り口では、すべてがUnicodeに変換され、出口では、すべてが Unicode を使用して処理され、出口でターゲットのエンコーディングに変換されます (もちろん、処理ロジックで使用する必要がある例外があります。特定のエンコーディング状況です)

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

IDE およびコンソールでエラーが報告されます。その理由は、印刷時にエンコードが IDE のものと一致しないためです。

出力時に同じエンコードに変換すると正常に出力できる

>>> ‘中文‘.encode(‘utf-8‘) 
Traceback (most recent call last): File "", line 1, in  UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe4 in position 0: ordinal not in range(128)  
>>> u‘中文‘.decode(‘utf-8‘) 
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode     return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range(128)
推奨事項

エンコードを標準化する

特定のリンクによる文字化けを防ぐためにエンコードを統一する

環境、IDE/テキスト

エディタ、ファイルエンコーディング、データベースデータテーブルエンコーディング

コードソースファイルのエンコーディングを確認してください

これは非常に重要です

ソースコードファイル内のpyファイルのデフォルトエンコーディングは、非ASCII文字の場合はASCIIです。を使用する場合は、ファイルのヘッダーでエンコーディングを宣言する必要があります。宣言しない場合は、ファイルの 1 行目または 2 行目にエンコーディングを配置する必要があります。

#s是code_A的str s.decode(‘code_A‘).encode(‘code_B‘)
ヘッダーでcoding= utf-8、a = '中国語'を宣言した場合、そのエンコーディングはutf-8です

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

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

ソース コード内で処理するためのハードコーディングされた文字列として使用され、一律に Unicode を使用します

将其类型和源文件本身的编码隔离开, 独立无依赖方便流程中各个位置处理

if s == u‘中文‘:  #而不是 s == ‘中文‘     pass #注意这里 s到这里时,确保转为unicode

以上几步搞定后,你只需要关注两个 unicode和 你设定的编码(一般使用utf-8)

处理顺序

1. Decode early 2. Unicode everywhere 3. Encode later 

相关模块及一些方法

获得和设置系统默认编码

>>> import sys 
>>> sys.getdefaultencoding() ‘ascii‘  
>>> reload(sys) <module ‘sys‘ (built-in)> 
>>> sys.setdefaultencoding(‘utf-8‘) 
>>> sys.getdefaultencoding() ‘utf-8‘ 
>>> str.encode(‘other_coding‘)

在python中,直接将某种编码的str进行encode成另一种编码str

#str_A为utf-8 str_A.encode(‘gbk‘)  执行的操作是 str_A.decode(‘sys_codec‘).encode(‘gbk‘) 这里sys_codec即为上一步 sys.getdefaultencoding() 的编码 

‘获得和设置系统默认编码‘和这里的str.encode是相关的,但我一般很少这么用,主要是觉得复杂不可控,还是输入明确decode,输出明确encode来得简单些

chardet

文件编码检测,下载

>>> import chardet 
>>> f = open(‘test.txt‘,‘r‘) 
>>> result = chardet.detect(f.read()) 
>>> result {‘confidence‘: 0.99, ‘encoding‘: ‘utf-8‘}

\u字符串转对应unicode字符串

>>> u‘中‘ u‘\u4e2d‘  
>>> s = ‘\u4e2d‘ 
>>> print s.decode(‘unicode_escape‘) 中  
>>> a = ‘\\u4fee\\u6539\\u8282\\u70b9\\u72b6\\u6001\\u6210\\u529f‘ 
>>> a.decode(‘unicode_escape‘) u‘\u4fee\u6539\u8282\u70b9\u72b6\u6001\u6210\u529f‘

以上がPythonのエンコード処理におけるstrとUnicodeの違いと用途分析を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。