已经有很多帮助,但我仍感到困惑。
我有一个像这样的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。
答案 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-le
或utf-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。