已经有很多帮助,但我仍然感到困惑.
我有一个像这样的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.
你有5个代码点.其中一个代码点位于Basic Multilingual Plane之外,这意味着这些代码点的UTF-16编码必须为该字符使用两个代码单元.
换句话说,客户端依赖于实现细节,并且做错了什么.它们应该计算代码点,而不是代码单元.有几个平台经常发生这种情况; 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
Run Code Online (Sandbox Code Playgroud)
如果你正在使用Python 2(并且u你可能会根据字符串的前缀来判断),请考虑到有两种不同版本的Python,具体取决于你如何构建它.根据构建时配置开关,您将拥有UCS-2或UCS-4版本; 前者也在内部使用代理,你的title价值长度也是6.有关单个Unicode字符串,请参阅Python返回长度2.
| 归档时间: |
|
| 查看次数: |
3119 次 |
| 最近记录: |