python编码问题

python 的编码问题

字符串是Python中最常用的数据类型,而且很多时候你会用到一些不属于标准ASCII字符集的字符,这时候代码就很可能抛出:
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xc4 in position 10: ordinal not in range(128)异常。这种异常在Python中很容易遇到,尤其是在Python2.x中,是一个很让初学者费解头疼的问题
通用逻辑
首先要明白字符串在Python内部的表示是unicode编码
编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。例如有A编码格式转换成B编码格式

          A ——> decode to unicode ——> unicode encode to B

关于ASCII码

在unicode 之前,都是用ASCII码,ASCII码是用来与计算机进行交流的语言,每个英文字符都以7位二进制的方式存储在计算机内,其范围是32~126.
比如键入A,计算机就会把A的ASCII码值65写入磁盘,然后计算机读取该文件时,首先把65转化成A再输出.也就是说存储在计算机中的内容都是一系列ASCII码组成的.共表示出233个字符

关于Unicode

Unicode是一种字符集,它为每一种现代或古代使用的文字系统中出现的每一个字符都提供了统一的序列号,规定了符号的二进制代码,但没有规定这个二进制代码应该如何存储。所以unicode是计算机支持这个星球上多种语言的秘密武器.
unicode 通过使用一个或多个字节来表示一个字符,共能表示超过9000个字符,超越了ASCII码.

ASCII: StringType
Unicode: UnicodeType
所以两种编码方式返回的类型不同

注:
内建的str() ,chr()函数并不能处理unicode类型的字符(if str(u’中文’), 首先被转成ASCII字符再转成string,当u’中文’时不能转成ASCII则报错)
新的内建函数unicode() , unichar()可以处理unicode类字符,实现相应功能

也就是说:Unicode的编码方式是固定的,但是实现方式根据不同的需要有跟多种,常见的有UTF-8、UTF-16和UTF-32等。UTF-8是最常用的,用1~4个字节表示字符,另外ASCII字符的UTF-8编码与ASCII字符完全相同.

unicode 应用指南
  • 字符串加前缀’u’则是指定字符用unicode编码;
  • 不要用str(),用unicode()代替;
  • 不要用过时的sting模块,如果传给他的是非ASCII字符,则会搞杂;
  • 不到必须时,不要在程序里编解码,只有写入文件或数据库或网页时,才调用encode(),只有把数据读回来才调用解码decode().--- 即写入的字符要sting.encode(‘utf-8’),读出时同理.

  • 一般情况下window默认编码gbk,linux默认编码utf8

  • python编程中 系统编码,python编码,文件编码 的概念。

    系统编码:默认写源码的编辑器的编码方式。它代表源码文件内的所有内容都是根据词方式编码成二进制码流。存入到磁盘中的。linux下通过locale命令查看。

    python编码:指python内设置的解码方式。如果不设定的话,python默认的是ascii解码方式。如果python源代码文件中不出现中文的话,这个地方怎么设定应该不会问题。

    设定方法:在源码文件开头(一定是第一行):#--coding:UTF-8--,源码文件的设置解码方式是UTF-8 或者

  • 一般情况下输出乱码的原因就是 没有按照系统解码的方式进行编码。
    比如print s, s类型为str,linux系统下系统默认编码为utf8编码,s在输出前就应该编码为utf8。如果s为gbk编码就应该这样输出。print s.decode(‘gbk’).encode(‘utf8’)才能输出中文。

    window下面情况相同,window默认编码为gbk编码,所以s输出前必须编码为gbk。

  • python处理中一般处理unicode类型。这样输出前直接编码即可。

  • 可以利用chardet模块进行检测当前字符或文件的编码方式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值