度記号を文字列に連結して、単語文書に書き込めるようにしようとしています。私はこのようにそれをやろうとしました。
degreeChar = u'\N{DEGREE SIGN}'
print degreeChar.encode('UTF-8')
これから得られる出力は次のとおりです。°
なぜÂ
表示されるのかわかりません。私は何を間違っていますか?非常にイライラ!
ありがとう。
度記号を文字列に連結して、単語文書に書き込めるようにしようとしています。私はこのようにそれをやろうとしました。
degreeChar = u'\N{DEGREE SIGN}'
print degreeChar.encode('UTF-8')
これから得られる出力は次のとおりです。°
なぜÂ
表示されるのかわかりません。私は何を間違っていますか?非常にイライラ!
ありがとう。
これを行う場合:
>>> degreeChar = u'\N{DEGREE SIGN}'
degreeChar
は 1 文字の Unicode 文字列です。具体的には、次のu'°'
とおりです。
>>> len(degreeChar)
1
>>> ord(degreeChar)
176
これを UTF-8 にエンコードすると、2 バイトの UTF-8 バイト文字列が得られます。
>>> dc = degreeChar.encode('UTF-8')
>>> len(dc)
2
>>> ord(dc[0]), ord(dc[1])
(194, 176)
UTF-8 として、そのバイトのペアは を意味しu'°'
ます。しかし、たとえば、Latin-1 や cp1252 のように、まったく同じバイトのペアはu'°'
. これがエンコーディングの違いの要点です。同じバイト シーケンスでも、エンコーディングが異なれば意味も異なります。詳細を表示するには:
>>> dc2 = dc.decode('latin-1')
>>> len(dc2)
2
>>> ord(dc2[0]), ord(dc2[1])
(194, 176)
print
では、 UTF-8 文字列を cp1252 端末に送信しようとするとどうなるでしょうか? または、それをバイナリ ファイルに保存し、それを cp1252 テキスト ファイルとして開きますか? もちろん、わかります°
。
それで、あなたはこれをどのように解決しますか?
まあ、UTF-8 でエンコードされたバイトを cp1252 端末に出力しようとしないでください! Python が端末のエンコーディングの推測に成功した場合は、最初にそれを Unicode 文字列として出力します。
>>> print u'°'
°
そうでない場合は、Python が端末のエンコーディングを正しく推測するように構成を修正するか(ほとんどの *nix システムでは簡単ですが、Windows ではそれほどではありません…)、手動で指定するか、間違ったエンコーディングではなく正しいエンコーディングにエンコードする必要があります。 1:
>>> print u'°'.encode('cp1252')
°