我在Windows 7terminal中使用Python解释器。
我试图围绕unicode和编码包裹我的头。
我input:
>>> s='ë' >>> s '\x89' >>> u=u'ë' >>> u u'\xeb'
问题1 :为什么strings
使用的编码与unicodestringu
使用的编码不同?
我继续,然后input:
>>> us=unicode(s) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0x89 in position 0: ordinal not in range(128) >>> us=unicode(s, 'latin-1') >>> us u'\x89'
问题2 :我试着用latin-1
编码,把string变成一个unicodestring(实际上,我先尝试了其他一些string,包括utf-8
)。 我怎样才能找出terminal用来编码我的string的编码?
问题3 :我怎样才能把terminal打印为 嗯,愚蠢的我。 u'xeb'
? '\x89'
或“ u'xeb'
?print(s)
做这项工作。
我已经看过这个相关的SO问题,但没有线索: 在Windows上设置Pythonterminal编码
Unicode不是一种编码。 你编码成字节串并解码成Unicode:
>>> '\x89'.decode('cp437') u'\xeb' >>> u'\xeb'.encode('cp437') '\x89' >>> u'\xeb'.encode('utf8') '\xc3\xab'
Windows终端使用DOS的遗留代码页。 对于美国的Windows,它是:
>>> import sys >>> sys.stdout.encoding 'cp437'
Windows应用程序使用Windows代码页。 Python的IDLE将显示窗口编码:
>>> import sys >>> sys.stdout.encoding 'cp1252'
你的结果可能有所不同
我不会一边说“终端”更适合Windows 7附带的“DOS提示符”是绝对垃圾, 这在Windows 95,NT,XP,Vista和7中是不好的。也许他们用Powershell来修复它,我不知道。 但是,这是当时困扰着微软操作系统开发的那种问题。
设置PYTHONIOENCODING
环境变量,然后将输出重定向到一个文件。
set PYTHONIOENCODING=utf-8 ./myscript.py > output.txt
然后使用Notepad ++,你可以看到你的输出的UTF-8版本。
win-unicode-console可以解决你的问题。 你应该尝试一下
pip install win-unicode-console
如果您对python和命令行输出问题的讨论感兴趣,请查看Python issue 1602 。 否则,只需使用win-unicode-console包。
py -m run script.py
根据脚本运行它,或者可以按照指示将win_unicode_console.enable()
添加到usercustomize
或sitecustomize
,以将其添加到每个调用中。
从教程中阅读本节后,通读这个关于unicode的 python HOWTO
在Python中创建Unicode字符串就像创建普通字符串一样简单:
>>> u'Hello World !' u'Hello World !'
要回答你的第一个问题,他们是不同的,因为只有当你使用u''
你创建一个unicode字符串。
第二个问题:
sys.getdefaultencoding()
返回默认编码
但是要引用链接 :
对于Unicode新手的Python用户有时被sys.getdefaultencoding()返回的缺省编码所吸引。 你应该知道的关于默认编码的第一件事是你不需要关心它。 它的值应该是'ascii',在将字节字符串StrIsNotAString转换为Unicode字符串时使用。
你问了一个问题1:第一个字符串是一个编码的字节串,但是第二个字符串根本不是一个编码,它是指一个unicode代码点,对于“LATIN小字母E WITH DIAERESIS”是十六进制的eb
。
现在,第一个编码是什么是一个有趣的问题。 我通常会期望它是utf-8,或者,因为你在Windows上,ISO-8859-1或Win-1252(它们并不完全一样,但足够接近)。 然而,utf-8中该字母的正常表示是c3 ab
而在Win-1252中,它实际上与unicode代码点相同,即hex eb
。 所以,这有点神秘。
看来你正在使用代码页CP850 ,这是有道理的,因为这是DOS的历史代码页,已经被转发到终端窗口。
>>> s '\x89' >>> us=unicode(s,'CP850') >>> us u'\xeb'
实际上,unicode对象没有“编码”。 你应该阅读在Python中的Unicode,以避免不断混淆。 这个演示文稿看起来是足够的 – http://farmdev.com/talks/unicode/ 。
你在俄罗斯的Windows版本,对不对? 你的终端使用cp1251。
正如你所想的那样:
>>> a = "ё" >>> a '\xf1' >>> print a ё
得到这样的错误时你打开任何文件吗? 如果是这样,尝试打开它
import codecs f = codecs.open('filename.txt','r','utf-8')
如果其他人在搜索时得到这个页面最简单的方法是先在终端中设置代码页
CHCP 65001
然后运行你的程序。
为我工作得很好。 对于电源外壳启动它
powershell.exe -NoExit /c "chcp.com 65001"
它来自python:在Windows终端的unicode,使用的编码?