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のエンコード処理におけるstrとUnicodeの違いと用途分析を詳しく解説
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は文字で構成される実際の文字列です
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)
>>> 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
>>> s = u‘中文‘ >>> s = ‘中文‘.decode(‘utf-8‘) >>> s = unicode(‘中文‘, ‘utf-8‘) >>> type(u‘中文‘) <type ‘unicode‘>
>>> u‘中文‘ u‘\u4e2d\u6587‘ >>> len(u‘中文‘) 2
>>> 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)
エディタ、ファイルエンコーディング、データベースデータテーブルエンコーディング
コードソースファイルのエンコーディングを確認してくださいこれは非常に重要ですソースコードファイル内のpyファイルのデフォルトエンコーディングは、非ASCII文字の場合はASCIIです。を使用する場合は、ファイルのヘッダーでエンコーディングを宣言する必要があります。宣言しない場合は、ファイルの 1 行目または 2 行目にエンコーディングを配置する必要があります。#s是code_A的str s.decode(‘code_A‘).encode(‘code_B‘)
将其类型和源文件本身的编码隔离开, 独立无依赖方便流程中各个位置处理
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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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