3

度記号を文字列に連結して、単語文書に書き込めるようにしようとしています。私はこのようにそれをやろうとしました。

degreeChar = u'\N{DEGREE SIGN}'
print degreeChar.encode('UTF-8')

これから得られる出力は次のとおりです。°なぜÂ表示されるのかわかりません。私は何を間違っていますか?非常にイライラ!

ありがとう。

4

3 に答える 3

6

これを行う場合:

>>> 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')
°
于 2013-08-05T19:21:26.997 に答える