Python长度的unicode字符串混淆

时间:2015-06-11 08:37:45

标签: python unicode

已经有很多帮助,但我仍感到困惑。

我有一个像这样的unicode字符串:

title = u'test'
title_length = len(title) #5

但是!我需要len(标题)为6.客户希望它是6,因为它们看起来与我在后端的方式不同。

作为一种解决方法,我已经编写了这个小助手,但我确信它可以得到改进(对编码有足够的了解)或者甚至可能是错误的。

title_length = len(title) + repr(title).count('\\U') #6

1。是否有更好的方法让长度为6? : - )

我认为我(Python)正在计算unicode字符的数量,即5个。客户端正在计算字节数?

2。我的逻辑会破坏其他需要4个字节的unicode字符吗?

运行Python 2.7 ucs4。

1 个答案:

答案 0 :(得分:6)

您有5个代码点。其中一个代码点位于Basic Multilingual Plane之外,这意味着这些代码点has to use two code units for the character的UTF-16编码。

换句话说,客户端依赖于实现细节,并且做错了。它们应该计算代码 points ,而不是代码单位。有几个平台经常发生这种情况; Python 2 UCS2构建就是其中之一,但Java开发人员常常忘记这些差异,就像Windows API一样。

您可以将文本编码为UTF-16并将字节数除以2(每个UTF-16代码单位为2个字节)。选择utf-16-leutf-16-be变体,在长度中不包含BOM

title = u'test'
len_in_codeunits = len(title.encode('utf-16-le')) // 2

如果您正在使用Python 2(并且根据u前缀来判断您可能正常使用的字符串),请考虑到有两种不同版本的Python,具体取决于您构建它的方式。根据构建时配置开关,您可以使用UCS-2或UCS-4构建;前者也使用代理内部,你的title值长度也是6。请参阅Python returns length of 2 for single Unicode character string