在度数符号之前获得一个字符

pez*_*rez 3 python cpu-word python-2.7

我试图将度符号连接到一个字符串,以便我可以将它写入word文档.我试过这样做.

degreeChar = u'\N{DEGREE SIGN}'
print degreeChar.encode('UTF-8')
Run Code Online (Sandbox Code Playgroud)

我得到的输出是°,我不知道为什么Â会出现.我究竟做错了什么?非常沮丧!

谢谢.

aba*_*ert 5

当你这样做:

>>> degreeChar = u'\N{DEGREE SIGN}'
Run Code Online (Sandbox Code Playgroud)

degreeChar是一个单字符的Unicode字符串 - 特别是u'°':

>>> len(degreeChar)
1
>>> ord(degreeChar)
176
Run Code Online (Sandbox Code Playgroud)

当您将其编码为UTF-8时,您将获得一个2字节的UTF-8字节字符串:

>>> dc = degreeChar.encode('UTF-8')
>>> len(dc)
2
>>> ord(dc[0]), ord(dc[1])
(194, 176)
Run Code Online (Sandbox Code Playgroud)

作为UTF-8,那对字节意味着u'°'.但是,比如拉丁语-1或cp1252,完全相同的字节对意味着u'°'.这就是不同编码的重点 - 相同的字节序列在不同的编码中意味着不同的东西.要查看详细信息:

>>> dc2 = dc.decode('latin-1')
>>> len(dc2)
2
>>> ord(dc2[0]), ord(dc2[1])
(194, 176)
Run Code Online (Sandbox Code Playgroud)

那么,如果你尝试print将UTF-8字符串连接到cp1252终端会发生什么?或者将其保存为二进制文件,然后将其作为cp1252文本文件打开?好吧,你°当然可以.


那么,你是如何解决这个问题的?

好吧,只是不要尝试将UTF-8编码的字节打印到cp1252终端!如果Python已经成功猜到了终端的编码,那么首先将其打印为Unicode字符串:

>>> print u'°'
°
Run Code Online (Sandbox Code Playgroud)

如果没有,你要么需要修复配置所以Python 正确猜出你的终端的编码(容易对大多数*nix系统,与其说是在Windows ...),或手动指定,或者只是编码到正确的编码,而不是错误的一:

>>> print u'°'.encode('cp1252')
°
Run Code Online (Sandbox Code Playgroud)