目次
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)
ログイン後にコピー
" >
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)
ログイン後にコピー
ホームページ バックエンド開発 Python チュートリアル Pythonのエンコード処理におけるstrとUnicodeの違いと用途分析を詳しく解説

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

Mar 16, 2017 pm 04:23 PM

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は? Apr 02, 2025 am 07:18 AM

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? 中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか? Apr 02, 2025 am 07:15 AM

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

正規表現とは何ですか? 正規表現とは何ですか? Mar 20, 2025 pm 06:25 PM

正規表現は、プログラミングにおけるパターンマッチングとテキスト操作のための強力なツールであり、さまざまなアプリケーションにわたるテキスト処理の効率を高めます。

uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? uvicornは、serving_forever()なしでhttpリクエストをどのように継続的に聞いていますか? Apr 01, 2025 pm 10:51 PM

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

人気のあるPythonライブラリとその用途は何ですか? 人気のあるPythonライブラリとその用途は何ですか? Mar 21, 2025 pm 06:46 PM

この記事では、numpy、pandas、matplotlib、scikit-learn、tensorflow、django、flask、and requestsなどの人気のあるPythonライブラリについて説明し、科学的コンピューティング、データ分析、視覚化、機械学習、Web開発、Hの使用について説明します。

文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? 文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? Apr 01, 2025 pm 11:18 PM

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

See all articles