Python长度的unicode字符串混乱

kev*_*kev 7 python unicode

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

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

title = u'test'
title_length = len(title) #5
Run Code Online (Sandbox Code Playgroud)

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

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

title_length = len(title) + repr(title).count('\\U') #6
Run Code Online (Sandbox Code Playgroud)

1.有更好的方法将长度变为6吗?:-)

我假设我(Python)计算的unicode字符数为5.客户端计算字节数?

2.我的逻辑是否会破坏其他需要4个字节的unicode字符?

运行Python 2.7 ucs4.

Mar*_*ers 7

你有5个代码点.其中一个代码点位于Basic Multilingual Plane之外,这意味着这些代码点的UTF-16编码必须为该字符使用两个代码单元.

换句话说,客户端依赖于实现细节,并且做错了什么.它们应该计算代码,而不是代码单元.有几个平台经常发生这种情况; 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
Run Code Online (Sandbox Code Playgroud)

如果你正在使用Python 2(并且u你可能会根据字符串的前缀来判断),请考虑到有两种不同版本的Python,具体取决于你如何构建它.根据构建时配置开关,您将拥有UCS-2或UCS-4版本; 前者也在内部使用代理,你的title价值长度也是6.有关单个Unicode字符串,请参阅Python返回长度2.