首页 > 解决方案 > 如何从字符串中获取字符 - 获取错误的字符和错误的字符串长度

问题描述

下面python给出了错误的字符串长度和错误的字符。
这里有人知道吗?

>>> w ='lòng'
>>> w 
'lòng'
>>> print (w)
lòng
>>> len(w)
5
>>> for ch in w:
...     print (ch + "-") 
... 
l- 
o- 
- 
n- 
g- 
>>> 

标签: pythonstringunicode

解决方案


这里的问题是,在 unicode 中,某些字符可能由其他字符的组合组成。在这种情况下,“lòng”包括小写“o”和重音符号作为单独的字符。

>>> import unicodedata as ud
>>> w ='lòng'
>>> for c in w:
...     print(ud.name(c))
... 
LATIN SMALL LETTER L
LATIN SMALL LETTER O
COMBINING GRAVE ACCENT
LATIN SMALL LETTER N
LATIN SMALL LETTER G

这是一个分解的unicode 字符串,因为带重音的 'o' 分解为两个字符。unicodedata模块提供了normalize函数来在分解和组合形式之间进行转换:

>>> for c in ud.normalize('NFC', w):
...     print(ud.name(c))
... 
LATIN SMALL LETTER L
LATIN SMALL LETTER O WITH GRAVE
LATIN SMALL LETTER N
LATIN SMALL LETTER G

如果您想知道字符串是否被规范化为特定形式,但不想实际规范化它,并且正在使用 Python 3.8+,则可以使用更高效的unicodedata.is_normalized函数(归功于用户 Acumenus):

>>> ud.is_normalized('NFC', w)
False
>>> ud.is_normalized('NFD', w)
True

Python 文档中的Unicode HOWTO包含一个关于比较字符串的部分,其中更详细地讨论了这一点。


推荐阅读