Python编码转换

0x00 概要

  记录通过从linux传输文件到windows的辛酸历程。

0x01 向ascii说不

  ASCII码一共规定了128个字符的编码,比如空格”SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。128个字符对于英文来说足够了,但对于中文来说是远远不够的。当接收文件名中包含中文的文件时,在创建文件的过程中易出现IOError: [Errno 22] invalid mode (‘r’) or filename这样的错误。python 2.7 默认编码为ascii。可以通过如图所示方式查看python默认编码


defaultencoding

  利用python从linux传输文件到windows第一步要做的就是设置默认编码为utf-8
1
2
3
4
5
import sys
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)

0x02 判断编码,进行编码转换

  判断编码推荐用chardet。chardet将给出为某种编码的可能性,代码如下:

1
2
import chardet
print chardet.detect(XXX)

  判断出编码类型后,对编码进行转换。

1
2
3
#假设判断为utf8编码
strtmp = strXXX.decode('UTF-8')
strXXX = strtmp.encode('GBK')

0x03 decode/encode失败处理

  在程序使用过程中,出现了decode/encode错误的情况,网上搜索后判断应该是字符串中存在半/全角符号无法被识别的情况。强行解决方案如下:

1
2
3
4
5
6
7
8
try:
  strtmp = strXXX.decode('UTF-8')
except:
  strtmp = strXXX.decode('UTF-8','ignore')
try:
  strXXX = strtmp.encode('GBK')
except:
  strXXX = strtmp.encode('GBK','ignore')

  上面的方法虽然能在一定程度上解决问题,但不可靠,如有建议欢迎留言。