Python中的字符串编码

0 投票
3 回答
2140 浏览
提问于 2025-04-15 11:20

在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这样的可逆编码,只有在需要给用户输出时再转换成特定的格式。

撰写回答