python3.x设置默认编码(ding和sys.defau。。
查了⼀会资料得出的结论是如果你⽤的是python3.x,那么就最好别去设置sys.defaultencoding或者ding
记住在需要编码的时候⽤encode,解码的时候decode就可以了。。。
这个问题貌似很复杂
⾸先区分⼀下ding和sys.defaultencoding
sys.defaultencoding
sys.defaultencoding是默认的字符串转化编码
在python2.x版本中,字符串默认编码是ascii,举例来说,
a="abc"+u"bcd"
当连接⼀个ascii编码的字节型字符串"abc"和⼀个unicode字符串bcd的时候,python调⽤"abc".defaultencoding())将abc转换成unicode编码,如果把"abc"替换成⼀个⾮ascii字符,编码⼯作就会失败,并提⽰UnicodeDecodeError。因为ascii字符实在是太少,显⽰中⽂都不⾏,所以python提供sys.setdefaultencoding允许⽤户设置默认编码。但是在python3.0中字符串默认使⽤的是unicode编码,所以defaultencoding将会被废弃。
ding
ding是终端输出编码,⽐⽅输出到windows控制台使⽤的编码..其实print函数就是对于sys.stdout.write()的封装,直接sys.stdout.write()也可以输出
在python2.x⾥⾯,可以通过设置环境变量PYTHONIOENCODING=ascii把ding改成ascii编码,但是在python3.x⾥⾯这种⽅法也⾏不通了
关于python3.0的ding可能⼜要分成两个来说,⼀个是windows控制台终端,⼀个是python的IDLE
windows控制台
对于windows控制台,python在输出的时候通过unicode API传送到windows控制台,如果控制台设置了
字体⽀持该字符显⽰,就会显⽰出来,如果控制台不⽀持显⽰,它就不显⽰,但也不会报错,⽽且还可以把它拷贝到它能显⽰的地⽅。
python的IDLE
IDLE貌似就没有windows控制台这么智能,不⽀持它就报错。这个不到解决办法,但是⼀般都能打印的,除⾮你尝试利⽤IDLE打印某些奇怪的字符
另外,还有⼀个可能是重点,python3.x默认的ding只是⼀个⾸选,⽐⽅把ding设置成ascii输出⽅式,当碰到要输出的内容是unicode编码的时候,它会⾃动在sys⾥寻某种合适的编码,然后采⽤这种编码,所以最后还是会以unicode编码的形式输出。
这样看起来是不是,在python3.x⾥设置ding也没什么⽤
最后看到⼀个有意思的例⼦
python中的字符串是什么
分别让windows控制台和IDLE执⾏print('\U0001F44D')
IDLE会报错,UnicodeEncodeError: 'UCS-2' codec can't encode character '\U0001f44d' in position 0: Non-BMP character not supported in Tk
windows控制台会显⽰两个框框,表⽰显⽰不了,但是可以复制粘贴到记事本是这样⼀个符号
但试着这样执⾏⼀下
non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)
print('\U0001F44D'.translate(non_bmp_map))
编码我觉得我还需要研究研究,很多地⽅可能我理解错了,所以最好看我帖的链接的原⽂

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。