参考资料:
缘起:
python2.7 使用spacy进行分句时,spacy的接口要求输入字符串格式是unicode, 我的输入是str, 程序运行时报出编码错误
总结:
先说结论, python2.7 中 str 类型 和 unicode 类型是两码事,str 类型要转换成unicode
需要知道str类型的编码方式 然后 string.decode("编码类型")
比如 读进来 "hello world"的编码方式是utf-8
"hello world".decode("utf-8") # 现在的类型就是unicode
python 3 中 str 类型就是 unicode类型,两者等价.
"hello world" == u"hello world" ==> True
"hello world".encode("utf-8") ==> b"hello world" # 内存中二进制的表示
字符到数字的编码(ascii、unicode)
ascii 是对常用的美语中常见字符到数字的映射(abcd等 到 0-255之间数字的一个对应关系)
ascii是计算机出现后,人们最开始的编码方式,unicode是对ascii的拓展。
unicode 则是对世界上所有语言的基本符号(比如中文中的 “中”“国”)到数字的一个映射,虽然规模更大, 但原理和ascii是一样的, 都是将语言中的基本组成单元字符("a", "中"等)映射到数字(ascii是直接用十进制数字表示,unicode 则是用16进制数字表示)
unicode到内存中(010111...)的编码
这是一个unicode数字串到内存中映射的过程,有多种做法。
uncode 字符串是一串数字,需要将unicode字符串以一串字节的形式存储在内存中,这个转换规则称为编码(比如,ascii,Latin-1, utf-8, utf-16, gbk)。python2中默认的到内存中的编码方式是ascii, python3 则是utf-8。编码到内存中的都是二进制的形式。
python2.7中编码总是出现问题的原因
python2中, 从文件读进来的字符串,或者我们自己输入的字符串都是内存中对应一定的编码(比如ascii,utf-8)后的str类型,str.decode("utf-8")之后才是unicode类型 , unicode又可以编码成各种类型。
python3 中,文件读进来和输入的字符串一开始都是unicode类型的字符串,具体在内存中的编码方式,由程序员自己设置,当然默认是utf-8编码。这种处理方式更符合人的直觉。
理清楚了这个过程处理python2、3中的编码问题就不是问题了。