Pythonにおける符号化問題を徹底的に理解する。
Pythonはテキストを処理する機能が非常に強いですが、初心者であれば、pythonのコード機構がよく分かりません。文字化けやdecode errorにもよく会います。本論文の目的は、pythonの符号化機構を簡単に説明し、いくつかの提案を与えることである。
問題1:問題はどこですか?
問題は私たちの標的です。心の中に問題がないと勉強に集中できません。
本論文で使用するプログラミング環境はcentos 6.7、python 2.7です。shellにpythonを入力してpythonコマンドラインを開きます。次の2つの言葉を入力します。
答えはできません。次のようなエラーがあります。
Unicode DecodeError:'ascii'codec can't decode byte 0 xe 4 in position 0:ordinal not in range(128)
エラーの中で説明されている0 xe 4に注意してください。これは私たちの分析ミスの突破口です。
多くの人がこのミスに出会ったと信じています。じゃ、新しい問題が来ました。
問題2:Why?
原因を明らかにするには、この二つの言葉の実行プロセスを真剣に分析してもいいです。
まず、私たちはキーボードでpythonコマンドラインの解釈器に中国zgを入力して英語の二重引用符を付けました。そして変数sに値を付けました。普通に見えますか?実は中には大きなブラックがあります。
私たちはキーボードを通じてプログラムに文字を入力すると、この機能はオペレーティングシステムによって完成されます。スクリーンで見た中国zgは実際にはオペレーティングシステムから人間へのフィードバックです。
オペレーティングシステムがプログラムにフィードバックするのは何ですか?答えは01列です。この01列はどうなりますか?
答えはオペレーティングシステムが自分のデフォルトのコード方式を使って、中国zgをエンコードして、エンコードした後の01列をプログラムにあげました。
私たちが使っているcentosシステムのデフォルトのコードはutf-8です。だから、中国zgの各文字のutf-8のコードを知っていれば、01列は何ですか?
照会後、それらのコードを取得することができます。16進数と2進数で表されます。
にある
国
z
g
E 4 B 8 AD
E 59 BBD
7 A
67。
111001 10011011 10111101
111001 10011011 10111101
01111010
01100111
オペレーティングシステムがプログラムに伝えている01列の長さはどうなっているか分かります。その後、プログラムはどうなりますか?
プログラムはこの01列が二重引用符で囲まれているのを見ました。もちろんこの01列は文字列です。そしてこの文字列はsに割り当てられました。
ここで、第一句の実行ロジックです。
今は二文目の実行を続けます。
このとき、pythonプログラムは自分のデフォルトのコードをsのコードとして使用し、さらにsの内容を識別する。このデフォルトのコードはASCIIですので、ASCIIでこの01列を説明して、文字列の内容を識別して、この文字列をutf-8符号に変えます。
はい、プログラムで出会った最初のバイトはE 4です。ASCIIコードにはこのようなものがありません。ASCIIコードの中でバイトの第一位は全部0です。
どうすればいいですか?
間違いを申告します。そこで私達は上の誤りを見ました。
エラー中の0 x e 4は、文字「中」のutf 8符号化の最初のバイトです。
問題3:How?
問題はどこにあるか分かりましたが、どうやって解決しますか?
明らかにプログラムを教えてくれれば、このsの中の01列のコードはutf-8です。プログラムは正確に動作するはずです。
しかし、このような解決方法には一つの問題があります。
もし私がプログラムを持っていたら、多くのテキストファイルを読みたいです。各テキストファイルのコードは違っています。読むファイルごとに一つのコード情報を守るのではないですか?煩瑣である。
さらに、これらの文書ファイルの内容を相互に比較接続するなどの操作をすると、コードが一致しなくなります。
pythonはどうやってこの問題を賢く解決しますか?
とても簡単で、decodeです。
decodeとは、文字列を持っていて、そのコードを知っています。コードコードコードコードという文字列を使えば、pythonは中の文字の内容を認識し、int配列を作って、各文字のunicode番号を保存します。
すべての文字列はこのようにして、プログラムの実行中に、各種のソースから得られた文字列に同じ表現があることを確認できます。それらは便利にいろいろな操作ができます。
上記のint配列はpythonによって一つのオブジェクト、すなわちunicodeオブジェクトとしてカプセル化されます。
問題4:どうやって解決しますか?
以下では、pythonコマンドラインに下記の2つのコードを入力します。
unicodeはここでクラスです。pythonの中のクラスです。
eはunicode文字列と呼ばれています。つまり、文字のunicode番号が保存されています。符号化は一切されていません。
その後、eを任意のコードにエンコードできます。例えば、下の操作は可能です。
たとえば、試してみたら、
これで、私たちはすでに二つのエラーを見ました。decode errorとencode errorはそれらを解決しました。
問題5:pythonのこのような文字コードの処理方法をどのように評価しますか?
まず、このような処理方法は非常に簡単である。任意のテキストは、プログラムに入るときにdecodeを行うとunicodeオブジェクトになります。ここではintで各文字のunicode番号が保存されています。このテキストを出力する時にもう一度エンコードを作成してください。私たちが必要なコードにエンコードすればいいです。
問題は、すべての文字を一つのポイントで表していますが、スペースがもったいないということですか?結局、ASCIIでエンコードします。英語の文字は一バイトだけでいいです。
確かに会費ポイントの空間ですが、今のメモリは十分大きいです。そしてプログラム内でしかこのような方式を使いません。文字列を書き込みたい時やネットを通じて転送する時、私達はいずれも該当のコードを作ります。
もう一つの問題があります。プログラムに書いてある文字列はどうすればいいですか?使うたびにデコードを使いますか?異なるオペレーティングシステムではデフォルトで使うコードは違っています。私たちはlinuxの下で、通常はutf 8でdecodeを作らなければなりません。Windowsの下で、gbkでdecodeを作る必要があります。このように、私達のコードは特定のプラットフォームでしか実行できません。
pythonは私たちに簡単な方法を提供してくれました。文字列の前にuを加えると、システムのコードを調べてくれます。そして自動的にdecodeを完成します。
問題6:まとめて何を学びましたか?
本論文では一般的なエラーを起点として,pythonにおける符号化問題を詳細に解析した。私たちはpythonが文字問題を処理する簡単なところを見ました。なぜpythonはこんなに強力なテキスト処理機能を持っているのか理解できます。
テスト問題:本当に理解したかどうかを見てください。
linux上にファイルa.txtがあると仮定します。中身は「中国語」の2文字です。符号化方式はutf-8です。
現在、pythonプログラムには次のような文が書かれています。
できません
s以下の表示はunicodeで、書き出す時pythonはそれをエンコードします。デフォルトで使うasciiコードは「中国語」の2文字をエンコードすることができませんので、エラーが発生します。
締め括りをつける
以上は小编が绍介したPythonのコード问题を彻底的に理解し、皆さんの助けになりたいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。
問題1:問題はどこですか?
問題は私たちの標的です。心の中に問題がないと勉強に集中できません。
本論文で使用するプログラミング環境はcentos 6.7、python 2.7です。shellにpythonを入力してpythonコマンドラインを開きます。次の2つの言葉を入力します。
s = " zg"
e = s.encode("utf-8")
このコードは運行できますか?答えはできません。次のようなエラーがあります。
Unicode DecodeError:'ascii'codec can't decode byte 0 xe 4 in position 0:ordinal not in range(128)
エラーの中で説明されている0 xe 4に注意してください。これは私たちの分析ミスの突破口です。
多くの人がこのミスに出会ったと信じています。じゃ、新しい問題が来ました。
問題2:Why?
原因を明らかにするには、この二つの言葉の実行プロセスを真剣に分析してもいいです。
まず、私たちはキーボードでpythonコマンドラインの解釈器に中国zgを入力して英語の二重引用符を付けました。そして変数sに値を付けました。普通に見えますか?実は中には大きなブラックがあります。
私たちはキーボードを通じてプログラムに文字を入力すると、この機能はオペレーティングシステムによって完成されます。スクリーンで見た中国zgは実際にはオペレーティングシステムから人間へのフィードバックです。
オペレーティングシステムがプログラムにフィードバックするのは何ですか?答えは01列です。この01列はどうなりますか?
答えはオペレーティングシステムが自分のデフォルトのコード方式を使って、中国zgをエンコードして、エンコードした後の01列をプログラムにあげました。
私たちが使っているcentosシステムのデフォルトのコードはutf-8です。だから、中国zgの各文字のutf-8のコードを知っていれば、01列は何ですか?
照会後、それらのコードを取得することができます。16進数と2進数で表されます。
にある
国
z
g
E 4 B 8 AD
E 59 BBD
7 A
67。
111001 10011011 10111101
111001 10011011 10111101
01111010
01100111
オペレーティングシステムがプログラムに伝えている01列の長さはどうなっているか分かります。その後、プログラムはどうなりますか?
プログラムはこの01列が二重引用符で囲まれているのを見ました。もちろんこの01列は文字列です。そしてこの文字列はsに割り当てられました。
ここで、第一句の実行ロジックです。
今は二文目の実行を続けます。
e = s.encode("utf-8")
は、文字列sをutf-8で符号化し、符号化した文字列をeに割り当てるという意味です。問題が来ました。プログラムは今sの中の01列を知っています。この01列は文字列を表していますが、この文字列のコードは何ですか?01列の既存のコードを知ってこそ、中の文字を解析することができます。また、utf-8のような新しいコードで再符号化することもできます。オペレーティングシステムはプログラムにのみ01列を送っていますが、プログラムという01列の文字コードは何ですか?このとき、pythonプログラムは自分のデフォルトのコードをsのコードとして使用し、さらにsの内容を識別する。このデフォルトのコードはASCIIですので、ASCIIでこの01列を説明して、文字列の内容を識別して、この文字列をutf-8符号に変えます。
はい、プログラムで出会った最初のバイトはE 4です。ASCIIコードにはこのようなものがありません。ASCIIコードの中でバイトの第一位は全部0です。
どうすればいいですか?
間違いを申告します。そこで私達は上の誤りを見ました。
エラー中の0 x e 4は、文字「中」のutf 8符号化の最初のバイトです。
問題3:How?
問題はどこにあるか分かりましたが、どうやって解決しますか?
明らかにプログラムを教えてくれれば、このsの中の01列のコードはutf-8です。プログラムは正確に動作するはずです。
しかし、このような解決方法には一つの問題があります。
もし私がプログラムを持っていたら、多くのテキストファイルを読みたいです。各テキストファイルのコードは違っています。読むファイルごとに一つのコード情報を守るのではないですか?煩瑣である。
さらに、これらの文書ファイルの内容を相互に比較接続するなどの操作をすると、コードが一致しなくなります。
pythonはどうやってこの問題を賢く解決しますか?
とても簡単で、decodeです。
decodeとは、文字列を持っていて、そのコードを知っています。コードコードコードコードという文字列を使えば、pythonは中の文字の内容を認識し、int配列を作って、各文字のunicode番号を保存します。
すべての文字列はこのようにして、プログラムの実行中に、各種のソースから得られた文字列に同じ表現があることを確認できます。それらは便利にいろいろな操作ができます。
上記のint配列はpythonによって一つのオブジェクト、すなわちunicodeオブジェクトとしてカプセル化されます。
問題4:どうやって解決しますか?
以下では、pythonコマンドラインに下記の2つのコードを入力します。
e = s.decode("utf-8")
isinstance(e,unicode)
プログラムの出力はTrueです。decodeの後に戻ってくるeは確かにunicodeオブジェクトです。unicodeはここでクラスです。pythonの中のクラスです。
eはunicode文字列と呼ばれています。つまり、文字のunicode番号が保存されています。符号化は一切されていません。
その後、eを任意のコードにエンコードできます。例えば、下の操作は可能です。
e.encode("utf-8")
e.encode("gbk")
あなたが選択したコードがeの文字をエンコードすればいいです。エンコードできないとエラーが発生します。たとえば、試してみたら、
e.encode("ascii")
ASCIIは中国という文字をエンコードできないので、エンコードのerrorが爆発します。これで、私たちはすでに二つのエラーを見ました。decode errorとencode errorはそれらを解決しました。
問題5:pythonのこのような文字コードの処理方法をどのように評価しますか?
まず、このような処理方法は非常に簡単である。任意のテキストは、プログラムに入るときにdecodeを行うとunicodeオブジェクトになります。ここではintで各文字のunicode番号が保存されています。このテキストを出力する時にもう一度エンコードを作成してください。私たちが必要なコードにエンコードすればいいです。
問題は、すべての文字を一つのポイントで表していますが、スペースがもったいないということですか?結局、ASCIIでエンコードします。英語の文字は一バイトだけでいいです。
確かに会費ポイントの空間ですが、今のメモリは十分大きいです。そしてプログラム内でしかこのような方式を使いません。文字列を書き込みたい時やネットを通じて転送する時、私達はいずれも該当のコードを作ります。
もう一つの問題があります。プログラムに書いてある文字列はどうすればいいですか?使うたびにデコードを使いますか?異なるオペレーティングシステムではデフォルトで使うコードは違っています。私たちはlinuxの下で、通常はutf 8でdecodeを作らなければなりません。Windowsの下で、gbkでdecodeを作る必要があります。このように、私達のコードは特定のプラットフォームでしか実行できません。
pythonは私たちに簡単な方法を提供してくれました。文字列の前にuを加えると、システムのコードを調べてくれます。そして自動的にdecodeを完成します。
問題6:まとめて何を学びましたか?
本論文では一般的なエラーを起点として,pythonにおける符号化問題を詳細に解析した。私たちはpythonが文字問題を処理する簡単なところを見ました。なぜpythonはこんなに強力なテキスト処理機能を持っているのか理解できます。
テスト問題:本当に理解したかどうかを見てください。
linux上にファイルa.txtがあると仮定します。中身は「中国語」の2文字です。符号化方式はutf-8です。
現在、pythonプログラムには次のような文が書かれています。
import codec
s=""
with codec.open("a.txt",encoding="utf-8") as f:
s=f.readline().strip()
with open("b.txt","w") as f:
f.write(s)
このコードは実行できますか?なぜですか?できません
s以下の表示はunicodeで、書き出す時pythonはそれをエンコードします。デフォルトで使うasciiコードは「中国語」の2文字をエンコードすることができませんので、エラーが発生します。
締め括りをつける
以上は小编が绍介したPythonのコード问题を彻底的に理解し、皆さんの助けになりたいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。