【问题标题】:string encodings in pythonpython中的字符串编码
【发布时间】:2009-05-01 09:36:24
【问题描述】:

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

time.strftime( "%b" )

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

【问题讨论】:

  • 既然您不需要做任何独特或不同的事情来“处理此类字符串”,那么您的问题是什么?

标签: python unicode codepages


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    但是,您这样做的真正目的是什么? 如果您只想重视 unicode,只需编写

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

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

    • mac os: unicode(unicode) -> unicode
    • win/eng: unicode(ascii) -> unicode
    • win/noneng: unicode(some_cp) -> 会被本地cp转换 -> unicode

    【讨论】:

      【解决方案3】:

      如果你有一个未知编码的相当长的字符串,你可以尝试猜测编码,例如使用https://github.com/dcramer/chardet 的通用编码检测器——当然不是万无一失,但有时它猜对了;-)。但这对非常短的字符串没有多大帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 2012-11-13
        • 2017-11-01
        相关资源
        最近更新 更多