鱼C论坛

 找回密码
 立即注册
查看: 2069|回复: 7

[已解决]小白求助,为什么同一个东西,python2和python3出来的东西不同啊

[复制链接]
发表于 2017-4-15 04:44:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我是小白,刚学,我用notepad++文本编辑器做练习来着,然后用windows powershell终端分别运行python2和python3,然后出来的文字python2的出来了乱七八糟的东西,怎么会这样啊


像这样,看得清么。。。



QQ图片20170415044150.png
最佳答案
2017-4-15 15:12:21
ASCII,是美国信息交换标准代码,一共128位,后来发现不够用,就在此ASCII标准上进行扩展,扩展出来的编码标准成为ANSI,美国国家协会认可的标准,中国人的扩展标准称为GBK,英国人的扩展标准称为ISO-8859-1,所以中文的windows系统扩展编码标准是GBK,英文的扩展标准是ISO-8858-1。
而Unicode是统一码联盟指定的编码方案,uft-8是它的转换格式之一
然后我是这么认为的,你在代码文件的开头写了一句:
-*- coding: utf-8 -*-意思就是将所有代码以uft-8的标准进行编码
但是,window中文系统下的中文编码部分是采用的GBK编码规则,也就是说你用了utf-8的标准进行编码,windows的cmd就无法再GBK的默认编码标准下进行解码,从而形成乱码
所以如果你写的是-*- coding:gbk -*-就不会有乱码的问题了,或者你可以在中文字符串前加一个u,如:u‘中文’,将其转换成unicode,也可以解决乱码的问题
在我们的日常编码生活中,经常会因为不知道系统软件的默认编码方式而导致的中文乱码
这里我有两种解决方式:
1、在中文字符串前加一个u,将它们都变成Unicode的形式,但是这会有个问题,在Python2一串字符有分str和Unicode两种类型,通过直接加u的方式会改变它所属的类型,即原本是str类型就变成了Unicode
2、比第一张方法稍微麻烦一点,但是不会有副作用,就是当你在文件的开头指定了统一编码方式后,如
-*- coding:utf-8 -*-,在打印的中文字符串后加.decode('utf-8'),如print '中文'.decode('utf-8');
但是有个规定是str类型的不能用encode方法,Unicode类型的不能用decode,所以在使用具体方法前还需要进行类型判断
最后对于Python3来说,解决了很多Python2的中文编码问题,这是因为Python3的str字符串等价于Python2中的Unicode字符串,也就是说python3中的'中文'相当于python2的u'中文'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-15 08:53:01 | 显示全部楼层
因为python2不能直接显示中文啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-15 09:27:56 | 显示全部楼层
两个版本的编码不同,2不能打印中文
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-15 10:52:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-15 14:55:01 | 显示全部楼层
库不同  就这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-15 15:12:21 | 显示全部楼层    本楼为最佳答案   
ASCII,是美国信息交换标准代码,一共128位,后来发现不够用,就在此ASCII标准上进行扩展,扩展出来的编码标准成为ANSI,美国国家协会认可的标准,中国人的扩展标准称为GBK,英国人的扩展标准称为ISO-8859-1,所以中文的windows系统扩展编码标准是GBK,英文的扩展标准是ISO-8858-1。
而Unicode是统一码联盟指定的编码方案,uft-8是它的转换格式之一
然后我是这么认为的,你在代码文件的开头写了一句:
-*- coding: utf-8 -*-意思就是将所有代码以uft-8的标准进行编码
但是,window中文系统下的中文编码部分是采用的GBK编码规则,也就是说你用了utf-8的标准进行编码,windows的cmd就无法再GBK的默认编码标准下进行解码,从而形成乱码
所以如果你写的是-*- coding:gbk -*-就不会有乱码的问题了,或者你可以在中文字符串前加一个u,如:u‘中文’,将其转换成unicode,也可以解决乱码的问题
在我们的日常编码生活中,经常会因为不知道系统软件的默认编码方式而导致的中文乱码
这里我有两种解决方式:
1、在中文字符串前加一个u,将它们都变成Unicode的形式,但是这会有个问题,在Python2一串字符有分str和Unicode两种类型,通过直接加u的方式会改变它所属的类型,即原本是str类型就变成了Unicode
2、比第一张方法稍微麻烦一点,但是不会有副作用,就是当你在文件的开头指定了统一编码方式后,如
-*- coding:utf-8 -*-,在打印的中文字符串后加.decode('utf-8'),如print '中文'.decode('utf-8');
但是有个规定是str类型的不能用encode方法,Unicode类型的不能用decode,所以在使用具体方法前还需要进行类型判断
最后对于Python3来说,解决了很多Python2的中文编码问题,这是因为Python3的str字符串等价于Python2中的Unicode字符串,也就是说python3中的'中文'相当于python2的u'中文'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-15 15:14:33 | 显示全部楼层
楼上内容是我从这里提取的:http://ajucs.com/2015/11/10/Python-character-encoding-explained.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-15 15:36:28 | 显示全部楼层
用简单点的话来说,就是2里面的编码即便你在版头写了coding: utf-8
调用cmd sell运行的时候中文还是会乱码.
这时候比较简单的解决方法就是把编码环境变成gbk.
再不然就是换个编译器,譬如pycharm什么的.
其实2跟3初学者学起来差距是不会太大的,反倒来说3对于新手更加的友好.
最好还是配个比较智能的编译器,别用比较原始的自带IDLE,很打击学习热情的.
就是怎么讲,前期的基础东西,没到文件io之前,你学会了2到了3还可以很快的转过来,当然用2会对编码,sell环境之类的更加敏感.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 09:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表