找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2989|回复: 6

[已解决] python编程中涉及到的编码概念

7

主题

33

帖子

33

积分

贫民

积分
33
bigpang 发表于 2017-12-14 13:16:04 | 显示全部楼层 |阅读模式
本帖最后由 bigpang 于 2017-12-18 14:20 编辑

作为一个非科班出生的,现在正在从事python开发的我而言,很多术语不明白,特别是一些相近的词。所以准备问一下大家:

1- 常听人说,python开发最好用苹果或者linux电脑,原因是windows编码对中文不够友好。

    这里的windows编码,是什么意思?这里的编码能改么?

2- 搜到一个东西,说,windows 默认字符集是GBK,是按照中国人标准设计的,无法更改。

    这里的默认字符集GBK,是指什么,和 1 中的编码是一个东西么?

3- 当控制台输出中文异常时,可以用chcp 65001 ,然后修改字体配置,这里我们修改的chcp 65001,是为了修改成utf-8,这里的utf-8编码指的什么?

如果有其他的关于编码或者字符集的常视,也可以解释一下,刚接触这个,有点不明白。

谢谢大家,以及版主们。

回复

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2017-12-14 18:47:46 | 显示全部楼层
同样非科班,说下自己的理解吧,
1. 编码就是指字符编码,一个字符,比如说"a"或"啊"在计算机中的存储方式,就是一串01组合的编码啦,而根据各国语言的差别,最开始为abc这些英文设计的编码可能不适用与其他国家的语言,后来就出现了其他编码方式或在原有的基础上改进扩增的编码
2. 常用的有utf-8,称为万国码,好像全世界通用,gbk,专门的汉字编码,等等还有好多乱七八糟的,我也记不住
回复 支持 反对

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2017-12-14 18:49:47 | 显示全部楼层
同样非科班,说下自己的理解吧,
1. 编码就是指字符编码,一个字符,比如说"a"或"啊"在计算机中的存储方式,就是一串01组合的编码啦,而根据各国语言的差别,最开始为abc这些英文设计的编码可能不适用与其他国家的语言,后来就出现了其他编码方式或在原有的基础上改进扩增的编码
2. 常用的有utf-8,称为万国码,好像全世界通用,gbk,专门的汉字编码,等等还有好多乱七八糟的,我也记不住
回复 支持 反对

使用道具 举报

7

主题

33

帖子

33

积分

贫民

积分
33
bigpang  楼主| 发表于 2017-12-15 09:09:56 | 显示全部楼层
uitb 发表于 2017-12-14 18:49
同样非科班,说下自己的理解吧,
1. 编码就是指字符编码,一个字符,比如说"a"或"啊"在计算机中的存储方式 ...

你说的这个,我大致知道。
我现在的状况是,我分不清我提问中说道的几个概念,不知道他们是一样的,还是有区别的。
比如,我们输出字符串时,encode和decode改的编码,和文件保存时的ascii或者utf8,gbk,以及所谓的系统编码,比如linux的utf8,mark的tuf8,windows的gbk这类的。他们说的是一个东西么?
比如,有人说,window的系统编码是根据地区来定的,中国就是gbk,可以更改设置到其他国家,编程utf8.我到网上搜,关于 windows 编码改utf8,所得到的,是如何将cmd通过chcp 65001 来改。这应该不是一个东西?
再者,windows下python编程,在读取目录时,中文很容易会变乱码,可能发生在读取目录,可能发生在生成中文名字的文件。在这种情况下,编码是如何起到作用,导致乱码的?
这类问题,我确实搞不懂,大兄弟能帮我阐述一下么?
回复 支持 反对

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2017-12-15 10:15:39 | 显示全部楼层
bigpang 发表于 2017-12-15 09:09
你说的这个,我大致知道。
我现在的状况是,我分不清我提问中说道的几个概念,不知道他们是一样的,还是 ...

我也不是太明白你说的区别指什么,
1 . utf8,gbk,ascii这些都是字符编码,都是用一串01的组合来代表实际字符储存在计算机中,如果是说编码方式的话,他们肯定不同。
    比如说(假设哈,肯定不是真实的),我最开始设计一种编码方式,ascii,00 代表a,01代表b,10代表c,11代表d,然后后面有人一看,咦你这玩意儿不行啊,a-d有了,那efg呢?我要重新设计一个编码,utf8,用0000代表a,0001代表b,0010代表c,0011代表d,0100代表e,......1111代表p,好了这下我编码出来的字符要全的多了,后来又有个中国人一看,你这全是数字英文的,我中文咋整?我要再设计个中文编码,gbk,00000000代表a,00000001代表b......00001111代表p,00010000代表汉字啊,00010000代表哦。。。。。,这样就出来多种不同的编码了,什么ASCII,utf-8,gbk啊什么玩意儿的一大堆,这个算是第一个问题,不知道说明白没?
2. chcp 65001, chcp是dos窗口改变编码的命令,65001是utf-8编码在dos中的代号
3. 乱码就是编码的问题啦,就用刚刚上面的假设,在ascii中,我的ab在计算机中存储为0001,如果是utf-8编码的话,0001就只能表示个a了,而在实际真实的编码中,天知道这样一个差别,就能从一个你想要的字符变成个什么玩意儿出来
回复 支持 反对

使用道具 举报

7

主题

33

帖子

33

积分

贫民

积分
33
bigpang  楼主| 发表于 2017-12-15 10:20:30 | 显示全部楼层
uitb 发表于 2017-12-15 10:15
我也不是太明白你说的区别指什么,
1 . utf8,gbk,ascii这些都是字符编码,都是用一串01的组合来代表实 ...

看来我可能需要琢磨一段时间了
回复 支持 反对

使用道具 举报

7

主题

33

帖子

33

积分

贫民

积分
33
bigpang  楼主| 发表于 2017-12-18 14:09:36 | 显示全部楼层
本帖最后由 bigpang 于 2017-12-18 15:13 编辑

编码解码:
    用二进制的数字表示字符集的字符。而每个输出设备,都有内含的字符集,可以将字符,对应显示。
自己的总结:
    个人理解:
        a 代码写好后,按照某种编码(默认的ascii,或者大家推荐的utf-8),编码,变成01存放到磁盘,这里称作,磁盘01,也就是我们看到的py文件,尽管看到的是中文,是代码,但是在磁盘的体现是,磁盘01。注:可以理解为,存放的二进制数据的数字,根据存放时选择的编码,映射到字符集中的字符,而编辑器或者打开工具,则将该字符集中的字符,以特定的表现形式,呈现在显示屏上。
        b 运行程序前,例如,使用python test.py ,首先会读取test.py的内容,即磁盘01的内容,以及test.py在编码时,所使用的编码,进行解码,最终能够成为我们肉眼可解读的内容。
        以上涉及到的,是文件保存时使用的编码规则。大家通常使用utf-8,也就是,txt格式在另存时可以指定的,utf-8编码。
        c 解码后,由python本身,将代码内容编译,变成指令,这些编译后的内容我们同样是看不懂的,同样,也是01形式,此处,可以称作指令01。
        d 在编译时,python会默认使用ascii编码。但ascii本身是不包含中文的,所以,如果在python项目的文件中,直接使用到中文给变量赋值,或者注释用到中文,就会报错。因为解释器是默认使用ascii字符集,一一对应转换。而中文,会提示,无法找到对应的映射(这类),就会在编码阶段出错。
        上述,关乎的,是代码里面使用的coding:utf-8。指的是python解释器本身使用什么编码规则,来把代码变成指令,变成计算机可以执行的命令。
        e 计算机在编译完成,难免设计到输出,就难免涉及到乱码。
        f 在编译后的命令中,变量对应的是指令01,其中的中文,在不同的编码规则下,同一个字,例如,‘中文’,对应变成的01,具体值有所不同。
        g 输出时,输出的框,例如windows下的cmd框,有一个默认的字符集,他能够根据不同的字符集,将不同的字符,通过显示屏显显示,这形同打开文件查看内容一样。而windows 的cmd框,默认的字符集是gbk,而python添加coding:utf-8等设置后,对应产生的字符是需要用utf-8来对应的,不同的映射,导致了乱码。
        h python中保存有两种格式的字符串,一类是str,一类是unicode,str可以是编码后的产物。而unicode,可以是解码后的产物,他应该是python在运行或编译时,自动完成,这么理解的原因是,a=u'中文' 和a=unicode('中文',defaultencoding),会起到类似的作用,比如,在windows的cmd中交互:a = u'中文',b= '中文',c=unicode(b,'gbk')中,a和c是一样的。所以,我觉得u标签其实就是代表了一个解码的步骤。输出设备可以输出str和unicode,如果是str,相当于是二进制码,需要先转成unicode,即映射到了字符代码,输出设备就是根据具体的字符代码,将文字显示。而unicode码,直接将文字显示。
        i 这里面有个注意事项:unicode是一种规范,而非实现方式,编码,例如,utf-8,gbk等,是实现方法。在这些实现方法上,utf-8兼容其他的字符集,这也是为什么大家推荐使用utf-8。所以,一个以utf-8方式得到的正确的unicode类型的字符串,是可以直接以其他的编码规则,编码成为各自对应的二进制码。所以,python2中,将str转成utf-8解码的unicode码,是编码转换间的一个重要步骤。
        以上,是关于输出时的编码理解。反说:当cmd交互式,未指定coding:utf-8可以支持中文,测试发现, 等同于coding:gbk,同时,此时通过u标签生成的unicode码,encode('utf-8')后,输出乱码。
        j 这时,就有几个现象:
            1,如果不涉及中文,那影响很小,没啥变化。
            2,如果涉及到中文,文件本身使用utf-8保存且顶部使用coding:utf-8时,编译后的变量值,对应的是utf-8的二进制码,即str类型。在windows的cmd中输出时,先是按照gbk解码,变成字符代码,然后根据字符集代码显示字符。然而,因为解码的规则不同,所以对应的字符代码就不同,显示的字符就不同,也就,乱码了。为什么没有报错?可能是因为两个字符集映射都很大,转变成为的字符代码都有存在,不像ascii,是不包括中文,所以,它没有报错。
            3,如果想让一个str格式的数据正常在windows的cmd窗口中显示,可以:1,使用utf-8解码,即按照utf-8将原本utf-8编码的值变成一个中间值,即utf-8的unicode。2,再将utf-8解码的值,以某种编码,例如,gbk,进行编码(步骤2可省略)。
            4,如果直接在文件中使用a=u'中文',功效等同于使用utf-8 进行解码,成为的中间值,这样的值,可以直接由windows的cmd输出。

短期,我将这么理解。如果理解错了,希望有人指出来。
一个可以防止乱码的代码段,会带来哪些后果还未知:
  1. # coding:utf-8
  2. from __future__ import unicode_literals,print_function

  3. import platform
  4. import warnings
  5. import sys

  6. def get_default_decode():
  7.     default_decode = 'utf-8'
  8.         sysstr = platform.system()
  9.         if(sysstr =="Windows"):
  10.                 default_decode = 'gbk'
  11.         elif(sysstr == "Linux"):
  12.                 default_decode = 'utf-8'
  13.         else:
  14.                 warnings.warn("the system is unknow")
  15.         return default_decode

  16. default_decode = get_default_decode()
  17. reload(sys)
  18. sys.setdefaultencoding(default_decode)
复制代码



回复 支持 反对

使用道具 举报

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

本版积分规则

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