在Python中,字符串可以是unicode(utf-16和utf-8)和具有不同编码的单字节(cp1251、cp1252等)。是否可以检查编码字符串是什么?例如,

time.strftime( "%b" )

将返回一个文本名称为月份的字符串。在 MacOS 下,返回的字符串将为 utf-16,在英语本地的 Windows 下,它将是采用 ascii 编码的单字节,在非英语语言环境的 Windows 下,它将通过语言环境的代码页进行编码,例如 cp1251。我该如何处理这样的字符串?

有帮助吗?

解决方案

字符串不存储任何编码信息,只需在转换为/从unicode转换或打印到输出设备时指定一个:

import locale
lang, encoding = locale.getdefaultlocale()
mystring = u"blabla"
print mystring.encode(encoding)

UTF-8 不是 unicode,它是unicode到单字节字符串的编码。

最佳做法是在python端使用unicode,使用unicode可逆编码(如UTF-8)存储字符串,并仅为用户输出转换为花哨的语言环境。

其他提示

字符集编码检测非常复杂。

然而,你这样做的真正目的是什么?如果您只想将值设为 unicode,只需编写

unicode(time.strftime("%b"))

它应该适用于您上面提到的所有情况:

  • 苹果系统:unicode(unicode) -> unicode
  • 获胜/英语:unicode(ascii) -> unicode
  • 赢/能:unicode(some_cp) -> 将被本地cp转换 -> unicode

如果您在未知编码中有一个相当长的字符串,您可以尝试猜测编码,例如使用通用编码检测器 https://github.com/dcramer/chardet - 不是万无一失的当然,但有时它猜对了;-)。但是对于非常短的字符串来说,这无济于事。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top