Python中的字符串编码
在Python中,字符串可以是Unicode格式(包括utf-16和utf-8),也可以是用不同编码的单字节字符串(比如cp1251、cp1252等)。那么,有没有办法检查一个字符串的编码方式呢?比如,
time.strftime( "%b" )
这个代码会返回一个包含月份名称的字符串。在MacOS上返回的字符串是utf-16编码,而在Windows上,如果是英文环境,则返回的是单字节的ascii编码;如果是在非英文环境的Windows上,它会根据当地的编码方式进行编码,比如cp1251。那么,我该如何处理这些字符串呢?
3 个回答
1
如果你有一段比较长的字符串,但不知道它的编码方式,你可以尝试去猜测一下编码,比如使用一个叫做“通用编码检测器”的工具,链接在这里:https://github.com/dcramer/chardet。这个工具并不是百分之百准确,但有时候它能猜对;-)。不过,对于非常短的字符串,这个方法就没什么用处了。
1
字符集编码的检测其实是个很复杂的事情。
不过,你真正想要达到的目的是什么呢?
如果你只是想把值变成unicode格式,那你只需要写:
unicode(time.strftime("%b"))
这样就能解决你上面提到的所有情况:
- 在mac os上:unicode(unicode) -> unicode
- 在win/eng上:unicode(ascii) -> unicode
- 在win/noneng上:unicode(some_cp) -> 会被本地编码转换 -> unicode
5
字符串本身并不保存任何编码信息,当你在进行Unicode转换或输出到设备时,需要指定一种编码方式:
import locale
lang, encoding = locale.getdefaultlocale()
mystring = u"blabla"
print mystring.encode(encoding)
UTF-8并不是Unicode,它只是把Unicode编码成单字节的字符串。
最佳做法是在Python中尽量使用Unicode,存储字符串时使用像UTF-8这样的可逆编码,只有在需要给用户输出时再转换成特定的格式。