【发布时间】:2012-08-06 17:11:31
【问题描述】:
我有一个编码为 Unicode 的韩语字符串,例如 u'정정'。我怎么知道表示这个字符串需要多少字节?
我需要知道确切的字节数,因为我将字符串用于 iOS 推送通知,并且它对有效负载的大小有限制。
len('정정') 不起作用,因为它返回的是字符数,而不是字节数。
【问题讨论】:
我有一个编码为 Unicode 的韩语字符串,例如 u'정정'。我怎么知道表示这个字符串需要多少字节?
我需要知道确切的字节数,因为我将字符串用于 iOS 推送通知,并且它对有效负载的大小有限制。
len('정정') 不起作用,因为它返回的是字符数,而不是字节数。
【问题讨论】:
你需要知道你想用什么编码来衡量你的字节大小:
>>> print u'\uC815\uC815'
정정
>>> print len(u'\uC815\uC815')
2
>>> print len(u'\uC815\uC815'.encode('UTF-8'))
6
>>> print len(u'\uC815\uC815'.encode('UTF-16-LE'))
4
>>> print len(u'\uC815\uC815'.encode('UTF-16'))
6
>>> print len(u'\uC815\uC815'.encode('UTF-32-LE'))
8
>>> print len(u'\uC815\uC815'.encode('UTF-32'))
12
您真的很想查看Python Unicode HOWTO 以充分了解 unicode 对象与其字节编码之间的区别。
另一篇优秀的文章是 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!),作者是 Joel Spolsky(Stack Overflow 背后的人之一)。
【讨论】:
C815 是 unicode 代码点。如果您知道 UTF-8 或 UTF-16 字节序列,则可以从中 decode 以获取 unicode 字符 ('\xEC\xA0\x95'.decode('UTF-8'))。 python 提示在这里很有帮助;例如,当向终端回显(不打印)unicode 值时,python 将使用它的unicode_escape 编码。
表示unicode 所需的字节数取决于您使用的编码。
>>> s = u'정정'
>>> len(s)
2
>>> len(s.encode('UTF-8'))
6
>>> len(s.encode('UTF-16'))
6
>>> len(s.encode('UTF-32'))
12
如果你要重用编码结果,我建议编码一次,然后拉出它的len 并在以后重用已经编码的结果。
【讨论】:
确保您使用的是正确的standard encoding。
如果不是,您可以随时使用decodedString = myString.decode('UTF-8')(如果不是 UTF-8,则使用您可以从上一个链接中找到的正确编码字符串替换 UTF-8)来获取格式为 @987654323 的字符串@ 应该返回正确的数字
【讨论】: