ホームページ バックエンド開発 Python チュートリアル Python は中国語の文字エンコーディングの問題を解決します: Unicode Decode Error_python

Python は中国語の文字エンコーディングの問題を解決します: Unicode Decode Error_python

Feb 23, 2017 pm 03:53 PM

前書き

最近、プロジェクトの必要性により、中国語を含む txt ドキュメントを読み取り、ファイルを保存する必要があります。この文書は以前、base64 でエンコードされていたため、すべての漢字が読み取られ、文字化けして表示されていました。プロジェクト チームが Base64 を放棄した後、2 つのエラーが連続して発生しました:

ascii codec can't encode characters in position ordinal not in range 128
UnicodeDecodeError: ‘utf8' codec can't decode byte 0x。
ログイン後にコピー

ASCII、Unicode、utf-8 について知らない場合は、文字列とエンコーディングに関するこの前の記事を読むことができます

その後、次の 3 つの概念を理解してください:

  1. ascii は数字、英語の文字、一部の特殊記号のみを表現できますが、中国語の文字は表現できません

  2. Unicode と utf-8 は両方とも中国語の文字を表現できます、unicode は固定長、utf です-8は可変長です

  3. メモリ内の保存方法は一般的にunicodeで、ディスクファイルの保存方法は一般にutf-8です。utf-8はストレージスペースを節約できるためです

それではPythonのデフォルトとは何ですかエンコーディングは?

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> reload(sys)
<module &#39;sys&#39; (built-in)>
>>> sys.setdefaultencoding(&#39;utf-8&#39;)
>>> sys.getdefaultencoding()
&#39;utf-8&#39;
ログイン後にコピー

Python のデフォルトのエンコーディングは、sys.setdefaultencoding('utf-8') 関数を通じて設定できます。 sys.setdefaultencoding(&#39;utf-8&#39;)函数设置python的默认编码。

python中可以通过encode和decode的方式改变数据的编码,比如:

>>> u&#39;汉字&#39;
u&#39;\u6c49\u5b57&#39;
>>> u&#39;汉字&#39;.encode(&#39;utf-8&#39;)
&#39;\xe6\xb1\x89\xe5\xad\x97&#39;
>>> u&#39;汉字&#39;.encode(&#39;utf-8&#39;).decode(&#39;utf-8&#39;)
u&#39;\u6c49\u5b57&#39;
ログイン後にコピー

我们可以通过这两个函数设置编码。

那么,python中的str是什么类型?

>>> import binascii
>>> &#39;汉字&#39;
&#39;\xba\xba\xd7\xd6&#39;
>>> type(&#39;汉字&#39;)
<type &#39;str&#39;>
>>> print binascii.b2a_hex(&#39;汉字&#39;)
babad7d6
>>> print binascii.b2a_hex(u&#39;汉字&#39;)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in
position 0-1: ordinal not in range(128)
>>> print binascii.b2a_hex(u&#39;汉字&#39;.encode(&#39;utf-8&#39;))
e6b189e5ad97
>>> print binascii.b2a_hex(u&#39;汉字&#39;.encode(&#39;gbk&#39;))
babad7d6
ログイン後にコピー

binascii是将数据的二进制转换成ascii,上面的解释是:‘汉字'的类型是str,二进制是babad7d6,u‘汉字'是无法转换成ascii,这样就报出了开头的第一个错误。解决办法就是把它.encode(‘utf-8')成str类型。因为我命令行是windows默认的GBK编码,所有u'汉字'.encode(‘gbk&#39;)

Python では、次のような encode と decode を通じてデータのエンコーディングを変更できます。

    import sys
    reloads(sys)
    sys.setdefaultencoding(&#39;utf-8&#39;)
    ログイン後にコピー
  1. これら 2 つの関数を通じてエンコーディングを設定できます。
  2. では、Python の str はどのような型でしょうか?

import codecs
codecs.open(file_name, "r",encoding=&#39;utf-8&#39;, errors=&#39;ignore&#39;)
ログイン後にコピー

binascii はデータのバイナリを ASCII に変換します。上記の説明は次のとおりです。「漢字」の型は str で、バイナリは babad7d6 です。u「漢字」は ASCII に変換できません。と報告されています 冒頭の最初の間違い。解決策は、 .encode('utf-8') して str 型に変換することです。私のコマンドラインは Windows のデフォルトの GBK エンコーディングを使用しているため、すべての u'中国語文字'.encode('gbk') が使用されている場合、出力結果は「中国語文字」の結果と同じになります。

要約すると、Python の str は実際には Unicode の一種です。非 ASCII を ASCII に変換すると、エラーが報告されます。

encode (' 適切なエンコーディング') => str

str => decode('適切なエンコーディング') => unicode

、これで保存できます。大変苦労しました:

🎜🎜rrreee🎜🎜🎜 2 番目の問題では、ファイルの読み取り時にエラーが発生します。 UTF-8 ファイルには BOM モードと BOM なしモードの 2 つのモードがあります。この 2 つの違いは、BOM ファイルには BOM なしファイルよりもヘッダーが 1 つ多いため、UTF-8 モードでファイルを読み取るときにエラーが発生することのようです。以前、ファイルを読み込もうとしたのですが、まずBOMがあるかどうかを判断してBOMファイルのヘッダーを読み飛ばしてしまい、失敗してしまいました~~。 🎜🎜具体的な操作方法は、コーデックライブラリを使用してファイルを読み取ることです(このライブラリはファイルのヘッダーを検出するためのものだと思います)。 🎜🎜🎜rrreee🎜🎜🎜 エンコードの問題については、ascii、unicode、utf-8 の動作原理を理解する必要があります。 🎜🎜中国語の文字エンコーディングの問題に対する Python の解決策の詳細については、Unicode Decode Error_python 関連記事、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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の 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を入力してください...

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

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

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

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

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

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

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

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

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

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

See all articles