精华内容
下载资源
问答
  • Python常见字符编码及其之间的转换

    万次阅读 2018-03-29 17:28:36
    参考:Python常见字符编码 + Python常见字符编码间的转换一、Python常见字符编码字符编码的常用种类介绍第一种:ASCII码ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是...

    参考:Python常见字符编码 + Python常见字符编码间的转换

    一、Python常见字符编码

    字符编码的常用种类介绍


    第一种:ASCII码

    ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。如下图所示:


    由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A的编码是65,小写字母 a的编码是97。后128个称为扩展ASCII码。
    在这里,每一位0或者1所占的空间单位为bit(比特),这是计算机中最小的表示单位,每8个bit组成一个字符,这是计算机中最小的存储单位。
    常见换算单位:
    bit 位,计算机中最小的表示单位
    8bit = 1bytes 字节,最小的存储单位,1bytes缩写为1B
    1KB=1024B
    1MB=1024KB
    1GB=1024MB
    1TB=1024GB 


    第二种:GBK 和 GB2312
    对于我们来说能在计算机中显示中文字符是至关重要的,然而ASCII表里连一个偏旁部首也没有。所以我们还需要一张关于中文和数字对应的关系表。一个字节只能最多表示256个字符,要处理中文显然一个字节是不够的,所以我们需要采用两个字节来表示,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。

    第三种:Unicode
    但如以来,就会出现一个问题,各个国家都一套自己的编码,就不可避免会有冲突,这是该怎么办呢?
    因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
    Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。   
    现在,分析一下ASCII编码和Unicode编码的区别:
    ASCII编码是1个字节,而Unicode编码通常是2个字节。
    字母A用ASCII编码是十进制的65,二进制的01000001;
    字符0用ASCII编码是十进制的48,二进制的00110000;
    汉字“中”已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。
    如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001。
    但如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

    第四种:UTF-8

    基于节约的原则,出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间了。如下所示:


    从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。
    我们总结一下现在计算机系统通用的字符编码工作方式:
    在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
    用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。如下图:


    二、Python常见字符编码间的转换

    (一)Unicode和UTF-8

    Unicode 起到了2个作用:
    直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
    unicode包含了跟全球所有国家编码的映射关系。
    Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间。例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍。由于计算机的内存比较大,并且字符串在内容中表示时也不会特别大,所以内容可以使用unicode来处理,但是存储和网络传输时一般数据都会非常多,那么增加1倍将是无法容忍的。
    为了解决存储和网络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode中的进行转换,以便于在存储和网络传输时可以节省空间。

    UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。
    UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
    UTF-32: 使用4个字节表示所有字符。

    总结:UTF 是为unicode编码 设计 的一种 在存储 和传输时节省空间的编码方案。

    (二)字符在硬盘上的存储

    首先要明确的一点就是,无论以什么编码在内存里显示字符,存到硬盘上都是2进制。
    比如:    
    ascii编码(美国):
    l   0b1101100
    o   0b1101111
    v   0b1110110

    e   0b1100101

    GBK编码(中国):
    老   0b11000000 0b11001111
    男   0b11000100 0b11010000

    孩   0b10111010 0b10100010

    还要注意的一点是,存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读(开头声明或转换),要不然就乱了。

    (三)编码的转换

    虽然有了unicode and utf-8 ,但是由于历史问题,各个国家依然在大量使用自己的编码,比如中国的windows,默认编码依然是gbk,而不是utf-8。基于此,如果中国的软件出口到美国,在美国人的电脑上就会显示乱码,因为他们没有gbk编码。所以该怎么办呢?还记得我们讲unicode其中一个功能是其包含了跟全球所有国家编码的映射关系,这时就派上用场了。无论你以什么编码存储的数据,只要你的软件在把数据从硬盘读到内存里,转成unicode来显示,就可以了。由于所有的系统、编程语言都默认支持unicode,那你的gbk软件放到美国电脑上,加载到内存里,变成了unicode,中文就可以正常展示啦。 

    Python3执行过程
    解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode,把代码字符串按照语法规则进行解释,所有的变量字符都会以unicode编码声明。在py3上 把你的代码以utf-8编写, 保存,然后在windows上执行,发现可以正常执行。其实utf-8编码之所以能在windows gbk的终端下显示正常,是因为到了内存里python解释器把utf-8转成了unicode , 但是这只是python3, 并不是所有的编程语言在内存里默认编码都是unicode,比如 万恶的python2 就不是, 是ASCII,想写中文,就必须声明文件头的coding为gbk or utf-8, 声明之后,python2解释器仅以文件头声明的编码去解释你的代码,加载到内存后,并不会主动帮你转为unicode,也就是说,你的文件编码是utf-8,加载到内存里,你的变量字符串就也是utf-8, 这意味着什么?意味着,你以utf-8编码的文件,在windows是乱码。
    其实乱是正常的,不乱才不正常,因为只有2种情况 ,你的windows上显示才不会乱。
    Python2并不会自动的把文件编码转为unicode存在内存里。
    字符串以GBK格式显示
    字符串是unicode编码
    所以我们只有手动转,Python3 自动把文件编码转为unicode必定是调用了什么方法,这个方法就是,decode(解码) 和encode(编码)。
    方法如下:

      UTF-8 --> decode 解码 --> Unicode

      Unicode --> encode 编码 --> GBK / UTF-8 

    规则如下:

    (四)Python bytes 类型

    把8个二进制一组称为一个byte,用16进制来表示。为的就是让人们看起来更可读。我们称之为bytes类型,即字节类型。

    python2的字符串其实更应该称为字节串。 通过存储方式就能看出来, 但python2里还有一个类型是bytes,难道又叫bytes又叫字符串?是的,在python2里,bytes == str , 其实就是一回事。除此之外, python2里还有个单独的类型是unicode , 把字符串解码后,就会变成unicode。

    Python2的默认编码是ASCII码,当后来大家对支持汉字、日文、法语等语言的呼声越来越高时,Python于是准备引入unicode,但若直接把默认编码改成unicode的话是不现实的, 因为很多软件就是基于之前的默认编码ASCII开发的,编码一换,那些软件的编码就都乱了。所以Python 2就直接用了一个新的字符类型,就叫unicode类型,比如你想让你的中文在全球所有电脑上正常显示,在内存里就得把字符串存成unicode类型。

    Python3 除了把字符串的编码改成了unicode, 还把str 和bytes 做了明确区分, str 就是unicode格式的字符, bytes就是单纯二进制啦。
    在py3里看字符,必须得是unicode编码,其它编码一律按bytes格式展示。

    Python只要出现各种编码问题,无非是哪里的编码设置出错了。

    常见编码错误的原因有以下这些: 
    Python解释器的默认编码
    Python源文件文件编码
    Terminal使用的编码

    操作系统的语言设置

    最后总结一下:
    python3  文件默认编码是utf-8 , 字符串编码是 unicode

                    以utf-8 或者 gbk等编码的代码,加载到内存,会自动转为unicode正常显示。

    python2  文件默认编码是ascii , 字符串编码也是 ascii , 如果文件头声明了是gbk,那字符串编码就是gbk。
          以utf-8 或者 gbk等编码的代码,加载到内存,并不会转为unicode,编码仍然是utf-8或者gbk等编码。
    展开全文
  • Python常见字符编码间的转换一、Python常见字符编码字符编码的常用种类介绍第一种:ASCII码ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的...

    参考:Python常见字符编码 + Python常见字符编码间的转换

    一、Python常见字符编码

    字符编码的常用种类介绍


    第一种:ASCII码

    ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。如下图所示:


    由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A的编码是65,小写字母 a的编码是97。后128个称为扩展ASCII码。
    在这里,每一位0或者1所占的空间单位为bit(比特),这是计算机中最小的表示单位,每8个bit组成一个字符,这是计算机中最小的存储单位。
    常见换算单位:
    bit 位,计算机中最小的表示单位
    8bit = 1bytes 字节,最小的存储单位,1bytes缩写为1B
    1KB=1024B
    1MB=1024KB
    1GB=1024MB
    1TB=1024GB 


    第二种:GBK 和 GB2312
    对于我们来说能在计算机中显示中文字符是至关重要的,然而ASCII表里连一个偏旁部首也没有。所以我们还需要一张关于中文和数字对应的关系表。一个字节只能最多表示256个字符,要处理中文显然一个字节是不够的,所以我们需要采用两个字节来表示,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。

    第三种:Unicode
    但如以来,就会出现一个问题,各个国家都一套自己的编码,就不可避免会有冲突,这是该怎么办呢?
    因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
    Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。   
    现在,分析一下ASCII编码和Unicode编码的区别:
    ASCII编码是1个字节,而Unicode编码通常是2个字节。
    字母A用ASCII编码是十进制的65,二进制的01000001;
    字符0用ASCII编码是十进制的48,二进制的00110000;
    汉字“中”已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。
    如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001。
    但如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

    第四种:UTF-8

    基于节约的原则,出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间了。如下所示:


    从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。
    我们总结一下现在计算机系统通用的字符编码工作方式:
    在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
    用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。如下图:


    二、Python常见字符编码间的转换

    (一)Unicode和UTF-8

    Unicode 起到了2个作用:
    直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
    unicode包含了跟全球所有国家编码的映射关系。
    Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间。例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍。由于计算机的内存比较大,并且字符串在内容中表示时也不会特别大,所以内容可以使用unicode来处理,但是存储和网络传输时一般数据都会非常多,那么增加1倍将是无法容忍的。
    为了解决存储和网络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode中的进行转换,以便于在存储和网络传输时可以节省空间。

    UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。
    UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
    UTF-32: 使用4个字节表示所有字符。

    总结:UTF 是为unicode编码 设计 的一种 在存储 和传输时节省空间的编码方案。

    (二)字符在硬盘上的存储

    首先要明确的一点就是,无论以什么编码在内存里显示字符,存到硬盘上都是2进制。
    比如:    
    ascii编码(美国):
    l   0b1101100
    o   0b1101111
    v   0b1110110

    e   0b1100101

    GBK编码(中国):
    老   0b11000000 0b11001111
    男   0b11000100 0b11010000

    孩   0b10111010 0b10100010

    还要注意的一点是,存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读(开头声明或转换),要不然就乱了。

    (三)编码的转换

    虽然有了unicode and utf-8 ,但是由于历史问题,各个国家依然在大量使用自己的编码,比如中国的windows,默认编码依然是gbk,而不是utf-8。基于此,如果中国的软件出口到美国,在美国人的电脑上就会显示乱码,因为他们没有gbk编码。所以该怎么办呢?还记得我们讲unicode其中一个功能是其包含了跟全球所有国家编码的映射关系,这时就派上用场了。无论你以什么编码存储的数据,只要你的软件在把数据从硬盘读到内存里,转成unicode来显示,就可以了。由于所有的系统、编程语言都默认支持unicode,那你的gbk软件放到美国电脑上,加载到内存里,变成了unicode,中文就可以正常展示啦。 

    Python3执行过程
    解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode,把代码字符串按照语法规则进行解释,所有的变量字符都会以unicode编码声明。在py3上 把你的代码以utf-8编写, 保存,然后在windows上执行,发现可以正常执行。其实utf-8编码之所以能在windows gbk的终端下显示正常,是因为到了内存里python解释器把utf-8转成了unicode , 但是这只是python3, 并不是所有的编程语言在内存里默认编码都是unicode,比如 万恶的python2 就不是, 是ASCII,想写中文,就必须声明文件头的coding为gbk or utf-8, 声明之后,python2解释器仅以文件头声明的编码去解释你的代码,加载到内存后,并不会主动帮你转为unicode,也就是说,你的文件编码是utf-8,加载到内存里,你的变量字符串就也是utf-8, 这意味着什么?意味着,你以utf-8编码的文件,在windows是乱码。
    其实乱是正常的,不乱才不正常,因为只有2种情况 ,你的windows上显示才不会乱。
    Python2并不会自动的把文件编码转为unicode存在内存里。
    字符串以GBK格式显示
    字符串是unicode编码
    所以我们只有手动转,Python3 自动把文件编码转为unicode必定是调用了什么方法,这个方法就是,decode(解码) 和encode(编码)。
    方法如下:

      UTF-8 --> decode 解码 --> Unicode

      Unicode --> encode 编码 --> GBK / UTF-8 

    规则如下:

    (四)Python bytes 类型

    把8个二进制一组称为一个byte,用16进制来表示。为的就是让人们看起来更可读。我们称之为bytes类型,即字节类型。

    python2的字符串其实更应该称为字节串。 通过存储方式就能看出来, 但python2里还有一个类型是bytes,难道又叫bytes又叫字符串?是的,在python2里,bytes == str , 其实就是一回事。除此之外, python2里还有个单独的类型是unicode , 把字符串解码后,就会变成unicode。

    Python2的默认编码是ASCII码,当后来大家对支持汉字、日文、法语等语言的呼声越来越高时,Python于是准备引入unicode,但若直接把默认编码改成unicode的话是不现实的, 因为很多软件就是基于之前的默认编码ASCII开发的,编码一换,那些软件的编码就都乱了。所以Python 2就直接用了一个新的字符类型,就叫unicode类型,比如你想让你的中文在全球所有电脑上正常显示,在内存里就得把字符串存成unicode类型。

    Python3 除了把字符串的编码改成了unicode, 还把str 和bytes 做了明确区分, str 就是unicode格式的字符, bytes就是单纯二进制啦。
    在py3里看字符,必须得是unicode编码,其它编码一律按bytes格式展示。

    Python只要出现各种编码问题,无非是哪里的编码设置出错了。

    常见编码错误的原因有以下这些: 
    Python解释器的默认编码
    Python源文件文件编码
    Terminal使用的编码

    操作系统的语言设置

    最后总结一下:
    python3  文件默认编码是utf-8 , 字符串编码是 unicode

                    以utf-8 或者 gbk等编码的代码,加载到内存,会自动转为unicode正常显示。

    python2  文件默认编码是ascii , 字符串编码也是 ascii , 如果文件头声明了是gbk,那字符串编码就是gbk。
          以utf-8 或者 gbk等编码的代码,加载到内存,并不会转为unicode,编码仍然是utf-8或者gbk等编码。

    注:
    本文转自《Python常见字符编码及其之间的转换》
    https://blog.csdn.net/sinat_36972314/article/details/79745438
    作者:微澜同学 转载

    展开全文
  • 主要内容: 1、Unicode 和 UTF-8的爱恨纠葛 ... 学习Python字符编码间的转换是绕不过去的一只拦路虎,不把编码彻底搞明白,总有一天它会猝不及防坑你一把。  Python2.x和Python3.x在字符编码...

    主要内容:

        1、Unicode 和 UTF-8的爱恨纠葛

        2、字符在硬盘上的存储

        3、编码的转换

        4、验证编码是否转换正确

        5、Python bytes类型

     

      前言:

      学习Python,字符编码间的转换是绕不过去的一只拦路虎,不把编码彻底搞明白,总有一天它会猝不及防坑你一把。

      Python2.x和Python3.x在字符编码的设置上也有很大区别(Python3未来将是主流,所以Python3为主),今天我们就来一起学习下。

      上一篇文章里我已经简述了Python的常见编码了,这里就不再赘述了,还不清楚的小伙伴可以先去看下:  http://www.cnblogs.com/schut/p/8406897.html

     

    一、Unicode 和 UTF-8的爱恨纠葛  

      Unicode 起到了2个作用:

    1. 直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
    2. unicode包含了跟全球所有国家编码的映射关系。

        Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间。

        例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍。

        由于计算机的内存比较大,并且字符串在内容中表示时也不会特别大,所以内容可以使用unicode来处理,但是存储和网络传输时一般数据都会非常多,那么增加1倍将是无法容忍的!!!

      为了解决存储和网络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode中的进行转换,以便于在存储和网络传输时可以节省空间!

      UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚语系占3个,其它及特殊字符占4个。

      UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。

      UTF-32: 使用4个字节表示所有字符。

      总结:UTF 是为unicode编码 设计 的一种在存储传输节省空间的编码方案。



    二、字符在硬盘上的存储

      首先要明确的一点就是,无论以什么编码在内存里显示字符,存到硬盘上都是2进制(0b是说明这段数字是二进制,0x表示是16进制。0x几乎所有的编译器都支持,而支持0b的并不多)。理解这一点很重要。

      比如:        

    ascii编码(美国):
            l   0b1101100
            o   0b1101111
            v   0b1110110
            e   0b1100101
    GBK编码(中国):
            老   0b11000000 0b11001111
            男   0b11000100 0b11010000
            孩   0b10111010 0b10100010
      还要注意的一点是:存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读(开头声明或转换),要不然就乱了。

    三、编码的转换
      
    虽然有了unicode and utf-8 ,但是由于历史问题,各个国家依然在大量使用自己的编码,
    比如中国的windows,默认编码依然是gbk,而不是utf-8。
      基于此,如果中国的软件出口到美国,在美国人的电脑上就会显示乱码,因为他们没有gbk编码。
      所以该怎么办呢?
      还记得我们讲unicode其中一个功能是其包含了跟全球所有国家编码的映射关系,这时就派上用场了。
    无论你以什么编码存储的数据,只要你的软件在把数据从硬盘读到内存里,转成unicode来显示,就可以了。
    由于所有的系统、编程语言都默认支持unicode,那你的gbk软件放到美国电脑上,加载到内存里,变成了unicode,
    中文就可以正常展示啦。
     
     Python3执行过程
    1、解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode
    2、把代码字符串按照语法规则进行解释
    3、所有的变量字符都会以unicode编码声明
      在py3上 把你的代码以utf-8编写, 保存,然后在windows上执行。
      发现可以正常执行!
      其实utf-8编码之所以能在windows gbk的终端下显示正常,是因为到了内存里python解释器把utf-8转成了unicode ,
    但是这只是python3, 并不是所有的编程语言在内存里默认编码都是unicode,比如 万恶的python2 就不是,
    它是ASCII(龟叔当初设计Python时的一点缺陷),想写中文,就必须声明文件头的coding为gbk or utf-8, 声明之后,python2解释器
    仅以文件头声明的编码去解释你的代码,加载到内存后,并不会主动帮你转为unicode,也就是说,你的文件编码是utf-8,
    加载到内存里,你的变量字符串就也是utf-8, 这意味着什么?意味着,你以utf-8编码的文件,
    在windows是乱码。
      其实乱是正常的,不乱才不正常,因为只有2种情况 ,你的windows上显示才不会乱。
    Python2并不会自动的把文件编码转为unicode存在内存里。
    1、字符串以GBK格式显示
    2、字符串是unicode编码
    所以我们只有手动转,Python3 自动把文件编码转为unicode必定是调用了什么方法,这个方法就是,decode(解码) 和encode(编码)。
    方法如下:
      UTF-8/GBK --> decode 解码 --> Unicode
    
      Unicode --> encode 编码 --> GBK / UTF-8 
      例如:
    #!/usr/bin/env python3
    #-*- coding:utf-8 -*-
    # write by congcong
    
    s = '匆匆'
    print(s)
    s1 = s.decode("utf-8") # utf-8 转成 Unicode,decode(解码)需要注明当前编码格式
    print(s1,type(s1))
    
    s2 = s1.encode("gbk") # unicode 转成 gbk,encode(编码)需要注明生成的编码格式
    print(s2,type(s2))
    
    s3 = s1.encode("utf-8") # unicode 转成 utf-8,encode(编码)注明生成的编码格式
    print(s3,type(s3))

      文件在 Python2 和 Python3 环境下运行结果的区别,如下所示:

    #coding:utf-8
    s = "你好,中国!" 
    print(s)     # Python2输出乱码,Python3正常输出
    print(type(s))    # 均输出 <type 'str'>
    
    #解码成unicode
    s1 = s.decode("utf-8")
    print(s1)    # Python2中输出 “你好,中国!”,Python3显示'str'对象没有属性'decode'
    print(type(s1))   # Python2中输出 <type 'unicode'>  Python3中输出 <class 'str'> 
    
    #编码成gbk 或 utf-8
    s2 = s1.encode('gbk')
    print(s2)      # Python2中输出 “你好,中国!”
    print(type(s2))    # Python2中输出 <type 'str'>
    s3 = s1.encode('utf-8')
    print(s3)      # Python2输出乱码,
    print(type(s3))    # 输出 <type 'str'>

    编码相互转换的规则如下:

     

    四、如何验证编码转对了呢?
      1、查看数据类型,python 2 里有专门的unicode 类型
      2、查看unicode编码映射表
      unicode字符是有专门的unicode类型来判断的,但是utf-8,gbk编码的字符都是str,你如果分辨出来的当前的字符串数据是何种编码的呢?
      有人说可以通过字节长度判断,因为utf-8一个中文占3字节,gbk一个占2字节。
      看输出的字节个数,也能大体判断是什么类型。精确的验证一个字符的编码呢,就是拿这些16进制的数跟编码表里去匹配。

      关于 Unicode 与 GBK 等编码对应关系(以中文“路”为例):

        


    完整的编码对应表可到这个网站下载:unicode与gbk的映射表 http://www.unicode.org/charts/
      


    五、Python bytes类型

      把8个二进制一组称为一个byte,用16进制来表示。为的就是让人们看起来更可读。我们称之为bytes类型,即字节类型。
      python2的字符串其实更应该称为字节串。 通过存储方式就能看出来, 但python2里还有一个类型是bytes呀,难道又叫bytes又叫字符串?
      嗯 ,是的,在python2里,bytes == str , 其实就是一回事。
      除此之外呢, python2里还有个单独的类型是unicode , 把字符串解码后,就会变成unicode。
    >>> s
    '\xe8\xb7\xaf\xe9\xa3\x9e' #utf-8
    >>> s.decode('utf-8')
    u'\u8def\u98de' #unicode 在unicode编码表里对应的位置
    >>> print(s.decode('utf-8'))
    路飞 #unicode 格式的字符 
    
    
    Python2的默认编码是ASCII码,当后来大家对支持汉字、日文、法语等语言的呼声越来越高时,Python于是准备引入unicode,但若直接把默认编码改成unicode的话是不现实的, 因为很多软件就是基于之前的默认编码ASCII开发的,编码一换,那些软件的编码就都乱了。所以Python 2就直接搞了一个新的字符类型,就叫unicode类型,比如你想让你的中文在全球所有电脑上正常显示,在内存里就得把字符串存成unicode类型。
    >>> s = "路飞"
    >>> s
    '\xe8\xb7\xaf\xe9\xa3\x9e'
    >>> s2 = s.decode("utf-8")
    >>> s2
    u'\u8def\u98de'
    >>> type(s2)
    <type 'unicode'>
    
    

     注意: 

      Python3 除了把字符串的编码改成了unicode, 还把str 和bytes 做了明确区分, str 就是unicode格式的字符, bytes就是单纯二进制啦。

      在py3里看字符,必须得是unicode编码,其它编码一律按bytes格式展示。

      Python只要出现各种编码问题,无非是哪里的编码设置出错了

    常见编码错误的原因有以下这些: 

    • Python解释器的默认编码
    • Python源文件文件编码
    • Terminal使用的编码
    • 操作系统的语言设置
    最后总结一下:
    
     python3   文件默认编码是utf-8 , 字符串编码是 unicode
           以utf-8 或者 gbk等编码的代码,加载到内存,会自动转为unicode正常显示。
    
     python2   文件默认编码是ascii , 字符串编码也是 ascii , 如果文件头声明了是gbk,那字符串编码就是gbk。
           以utf-8 或者 gbk等编码的代码,加载到内存,并不会转为unicode,编码仍然是utf-8或者gbk等编码。
    
    

    返回顶部↑

    转载于:https://www.cnblogs.com/schut/p/8407258.html

    展开全文
  • 开发过程中经常会遇到一些字符编码的问题,于是找了一个转换字符编码的函数 import sys def filter( srcFile, encode, trgFile ): error = True while error: try: fs = open( srcFi...

    开发过程中经常会遇到一些字符编码的问题,于是找了一个转换字符编码的函数

     

    import sys
    
    def filter( srcFile, encode, trgFile ):
    	error = True
    
    	while error:
    		try:
    			fs = open( srcFile, encoding = encode )
    			content = fs.read()
    			fs.close()
    
    			error = False
    			print( 'Success!' )
    		except UnicodeDecodeError as ude:
    			pos1, pos2 = ude.args[2], ude.args[3]
    			fs = open( srcFile, 'rb' )
    			content = fs.read()
    			fs.close()
    
    			content = content[:pos1] + content[pos2+1:]
    
    			ofs = open( srcFile, 'wb' )
    			ofs.write( content )
    			ofs.close()
    
    		except:
    			print( 'Other error happened!' )
    			break
    
    if __name__ == '__main__':
    	if len(sys.argv) < 4:
    		print( 'Usage:' )
    		print( sys.argv[0] + ' input-file input-encoding output-file' )
    	else:
    		filter( sys.argv[1], sys.argv[2], sys.argv[3] )

    转载于:https://my.oschina.net/wubiao239/blog/869682

    展开全文
  • Python常见字符编码间的转换 主要内容: 1、Unicode 和 UTF-8的爱恨纠葛 2、字符在硬盘上的存储 3、编码的转换 4、验证编码是否转换正确 5、Python bytes类型  前言:  学习Python字符编码间的...
  • python_字符编码转换

    2017-08-25 15:47:00
    先说python2 py2里默认编码是ascii 文件开头那个编码声明是告诉解释这个代码的程序 以什么编码格式 把这段代码读入到内存,因为到了内存里,这段代码其实是以bytes二进制格式存的,不过即使是2进制流,也可以按...
  • 指定当前文件编码格式:#-*- coding:utf-8 -*-unicode(万国码): 英文字母 1个字节,中文3个字节python中所有的字符都是unicode编码所有非unicode编码互转都需要先转换成unicode: unicode encode --> utf-8/gbk...
  • python字符编码转换

    2019-09-20 02:19:34
    py2: 文件保存为(utf-8)文件第一行...4、py3中默认编码为utf-8,在使用encode()和decode()时,不用传参时默认使用utf-8编码;py2中默认使用ascii 转载于:https://my.oschina.net/u/4006483/blog/2396617
  • 字符编码转换 函数 #声明文件编码,格式如下: #-*- coding:utf-8 -*- 注意此处只是声明了文件编码格式,python的默认编码还是unicode 字符编码转换: import sys print(sys.getdefaultencoding...
  • Python中有两个和字符很相关的类型,一个是str类型,一个是...decode的作用是将其他编码字符转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码字符串str1转换成unicode编码。 encode的作...
  • 1 - 编码格式转换 1.1 编码格式介绍 字符集 介绍 ASCII ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符 ANSI ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x00~0x7f ...
  • python字符编码转换

    2018-03-13 11:11:52
    python字符编码转换Python 默认脚本文件都是 UTF-8 编码的,当文件中有非 UTF-8 编码范围内的字符的时候就要使用"编码指示"来修正. 关于 sys.defaultencoding,这个在解码没有明确指明解码方式的时候使用...
  • ASCII 只能存英文和特殊字符,一个字节,占8位 utf-8为扩展的Unicode,英文依然按ASCII,中文按三个字节 不通编码的要互相转化需要Unicode来作桥梁 Unicode和utf-8是可以直接显示的 s=”你好” s_to_gbk=s....
  • 一、python常见字符编码 字符编码 目前使用的编码方式有:ASCII码(一个字节)、Unicode码(两个字节)、UTF-8码(可变长的编码)。我们已经知道了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码...
  • 主要介绍了python转换字符串为摩尔斯电码的方法,涉及Python字符串及编码操作的相关技巧,非常简单实用,需要的朋友可以参考下
  • Python3 字符编码

    2018-05-06 21:44:00
    Python3 字符编码 编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个...
  • Python字符编码转换

    2019-04-18 18:25:00
    在备编码相关的课件时,在知乎上看到一段关于Python编码的回答这哥们的这段话说的太对了,搞Python不把编码彻底搞明白,总有一天它会猝不及防坑你一把。不过感觉这哥们的答案并没把编码问题写明白,所以只好亲自动笔...
  • 如果操作系统的编码为,zh_CN.UTF-8,即...这种情况下,我们转换UTF-8到GBK python -c 'x="中国";print x.decode("utf8").encode("gbk")' > gbk_china_py.2.txt 在另一咱情况下,如果操作系统的编码为,zh_CN.GB2...
  • Python字符编码转换

    千次阅读 2019-03-26 20:07:00
    字符编码转换 最早的字符编码是ASCII码,只包括0-9的数字,A-Z和a-z的字母以及空格、制表符等其他符号共256个字符。 随着信息技术的发展,各国的文字都需要进行编码,因此就出现了 GBK/GB2312 编码以及 UTF-...
  • Python字符编码

    2019-08-13 20:52:15
    标题字符编码 字符编码的前世今身 1.字符集概述: 一套文字符号及其编码的描述。 2.几个基本概念: ❤位:计算机的最小单位 二进制中的一位, 用二进制的0/1表示。 ❤字节:八位组成一个字节。 ...
  • python——字符编码

    2019-01-08 20:37:00
    1、什么是字符编码:字符翻译成数字,所遵循的标准就是字符编码 2、以下两个场景涉及到字符编码的问题: 1.文件在存、取时 2.文件执行时 为什么硬盘中的文件不用Unicode编码形式存储。 Uni...
  • python 字符编码及转码 python 默认编码 python 2.X 默认的字符编码是ASCII, 默认的文件编码也是ASCII python 3.X 默认的字符编码是unicode,默认的文件编码也是unicode 注意:unicode和utf-8之间可以不需要...
  • 今天小编就python中的字符编码问题为带来讲解,同时教大家转换字符的方法。python源文件的字符编码 字符编码(Character Encoding)是将字符集中的字符码映射为字节流的一种具体实现方案,常见的字符编码有 ASCII ...
  • 可以先看一下这篇文章python常用的字符编码。在实战中Unicode的概念其实在我们开发人员的脑海里应该是一个中间层的角色。以UTF-8格式存储的文件,当呗读入内存时,会以Unicode的形态存在于内存中,因为Unicode是万能...
  • Python3】Python字符编码 一、字符集和字符编码 1. 定义 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机...
  • python-字符编码

    2018-11-23 19:32:34
    字符编码指的是字符转换成/编码成数字 编码的过程一定要遵循一个标准,该标准称之为字符编码表 字符---------------------编码--------------------------&amp;amp;gt;数字 字符&amp;amp;lt;---------------...
  • python字符编码

    2018-11-04 23:19:29
    什么是字符编码 计算机能执行和储存的数据均为二进制数字,因此写出的代码字符均要转换成二进制数字才能执行(字符–&amp;amp;amp;amp;gt;转换–&amp;amp;amp;amp;gt;数字),这个过程就是一个字符如何通过...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,634
精华内容 1,453
关键字:

python转换字符编码

python 订阅