Python2 str unicode小记

str与unicode

在Python,str与unicode是两种不同的类型。

string里的character是有多种编码方式的,比如单字节的ASCII,双字节的GB2312等等,再比如UTF-8。很明显要想解读string,必需知道string里的character是用哪种编码方式,然后才能进行。

Unicode code unit又是什么东西呢?一个Unicode code unit是一个16-bit或者32-bit的数值,每个数值代表一个unicode符号。在python里,16-bit的unicode,对应的是ucs2编码。32-bit对应的是ucs4编码。是不是感觉string里character的编码没什么区别?反正我现在脑子里就是这样一个印象:在Python里,ucs2或者ucs4编码的,我们叫做unicode object,其他编码的我们就叫做string。

decode与encode

  • str->unicode: 首先需要知道str是以哪种编码方式编码的,然后将其解码为unicode,如str.decode('utf-8')
  • unicode->str: 首先需要明白你想得到以哪种编码方式的str,然后将其编码,如unicode.encode('gbk')注:如果结果中包含中文,不用能用ASCII编码,因为中文编码不在ascii编码能够表示的范围之内,从而导致UnicodeEncodeError: 'ascii' codec can't encode character u'\u3001' in position 0: ordinal not in range(128)错误
  • str.encode(): str.encode()实际上等价于str.decode(sys.defaultencoding).encode().而sys.defaultencoding一般是ascii,它是不能用来编码中文字符的。所以如果str中包含中文,就会出现UnicodeEncodeError: 'ascii' codec can't encode character u'\u3001' in position 0: ordinal not in range(128),解决方法为先将str解码其他编码方式,然后再编码。

总结

总之,个人觉得str只进行decode操作,unicode只进行encode操作,然后对编码方式有一定的了解,错误就会少很多,并且容易解决一些。

Reference