python 中的字符串编码
在Python中,字符串可以是unicode(utf-16和utf-8)和具有不同编码的单字节(cp1251、cp1252等)。 是否可以检查编码字符串是什么? 例如,
time.strftime( "%b" )
将返回文本名称为月份的字符串。 在 MacOS 下,返回的字符串将为 utf-16,在英语本地的 Windows 下,它将是采用 ascii 编码的单字节,在非英语语言环境的 Windows 下,它将通过语言环境的代码页进行编码,例如 cp1251。 我该如何处理这样的字符串?
In python, strings may be unicode ( both utf-16 and utf-8 ) and single-byte with different encodings ( cp1251, cp1252 etc ). Is it possible to check what encoding string is? For example,
time.strftime( "%b" )
will return a string with text name of a month. Under MacOS returned string will be utf-16, under Windows with English local it will be single byte with ascii encoding, and under Windows with non-English locale it will be encoded via locale's codepage, for example cp1251. How can i handle such strings?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
字符串不存储任何编码信息,您只需在与 unicode 相互转换或打印到输出设备时指定一个编码信息:
UTF-8 不是 unicode,它是将 unicode 编码为单个字符字节字符串。
最佳实践是在 python 端的任何地方使用 unicode,使用 unicode 可逆编码(例如 UTF-8)存储字符串,并仅为用户输出转换为精美的语言环境。
Strings don't store any encoding information, you just have to specify one when you convert to/from unicode or print to an output device :
UTF-8 is not unicode, it's an encoding of unicode into single byte strings.
The best practice is to work with unicode everywhere on the python side, store your strings with an unicode reversible encoding such as UTF-8, and convert to fancy locales only for user output.
字符集编码检测非常复杂。
然而,你这样做的真正目的是什么?
如果您只想将值设为 unicode,只需编写即可
,它应该适用于您上面提到的所有情况:
charset encoding detection is very complex.
however, what's your real purpose for this?
if you just want to value to be in unicode, simply write
and it should work for all the cases you've mentioned above:
如果您有一个未知编码的相当长的字符串,您可以尝试猜测编码,例如使用通用编码检测器 https://github.com/dcramer/chardet——当然不是万无一失的,但有时它猜对了;-)。 但这对于非常短的字符串没有多大帮助。
If you have a reasonably long string in an unknown encoding, you can try to guess the encoding, e.g. with the Universal Encoding Detector at https://github.com/dcramer/chardet -- not foolproof of course, but sometimes it guesses right;-). But that won't help much with very short strings.