Python 如何从字符串中获取字符-获取错误的字符和错误的字符串长度
下面python给出了错误的字符串长度和错误的字符。Python 如何从字符串中获取字符-获取错误的字符和错误的字符串长度,python,string,unicode,Python,String,Unicode,下面python给出了错误的字符串长度和错误的字符。 这里有人知道吗 >>> w ='lòng' >>> w 'lòng' >>> print (w) lòng >>> len(w) 5 >>> for ch in w: ... print (ch + "-") ... l- o- - n- g- >>> Unicode允许在编码字符时有很大的灵活性。在这
这里有人知道吗
>>> w ='lòng'
>>> w
'lòng'
>>> print (w)
lòng
>>> len(w)
5
>>> for ch in w:
... print (ch + "-")
...
l-
o-
-
n-
g-
>>>
Unicode允许在编码字符时有很大的灵活性。在这种情况下,
ò
实际上由2个Unicode代码点组成,一个用于基本字符o
,一个用于重音符号。Unicode还有一个字符同时表示这两个字符,它不在乎使用哪一个。Unicode允许在编码字符时有很大的灵活性。Python包含一个可以提供一致表示的包
>>> import unicodedata
>>> w ='lòng'
>>> len(w)
5
>>> len(unicodedata.normalize('NFC', w))
4
这里的问题是,在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”分解为两个字符。模块提供分解表单与合成表单之间的转换功能:
如果您想知道字符串是否规范化为特定形式,但不想实际规范化它,并且正在使用Python 3.8+,可以使用更高效的函数(归功于用户):
Python文档中的包含了一个部分,对此进行了更详细的讨论。问题在于
len
函数和中的运算符在使用Unicode时被破坏
到目前为止,有两个答案声称标准化是解决方案。不幸的是,通常情况下并非如此:
>>w='1〕Ꙝ̛͋ᄀᄀᄀ각ᆨᆨ长度应为4,w[1]应为“o”。Javascript和visual basic工作(而不是Python)是一个unicode字符串。字符串的pythonlen()
方法计算代码点。第二个字符使用了2个代码点。@RDA因为您确定为重复的问题实际上与此处描述的问题相反。重复的目标并不能很好地解释这种特殊情况,IMO,但请看一看Unicode如何使用部分,了解Unicode如何从两个单独的字符组成重音字符。@CommandMe我在MacOS上测试了Python 3.7和3.8中的len('lòng')
,它是4,而不是5。这个问题无法重现。从Python3.8开始,该函数也存在,需要先检查。是的,仍然在3.8中中断。你可以自己测试一下。他们只是更新了一些数据文件,当然这不会改变len
的工作方式。你可以在回答中链接到你所说的第三方软件包。我在MacOS上用Python 3.7和3.8测试了len('lòng')
,它是4,而不是5。至于你的字符串Ꙝ̛͋ᄀᄀᄀ각ᆨᆨ您的lòng
与此线程中所有其他参与者使用的lòng
不同Stackexchange软件破坏了我的示例输入。在这里,它再次是在逃脱的符号中,所以我可以绕过那个漏洞,在这里,再次是在逃脱的符号中,在这里,再次是在逃脱的符号中,所以我可以在逃脱的符号中,所以我可以在逃脱的符号中,所以我可以在逃逃的符号中,所以我可以在逃逃的符号中,再次是在这里,我在逃逃逃出的符号的地方,在这里,我的,在以下的错误:::::{{{{{U+0+0+0+0+0 0+0 0 0 0 0 0 0.0031B元元元元元元元元元0 0 0 0 0 0 0 0 0 0 0+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0+0 0 0 0 0 0 0 0 0 0 0 0 0{{{{{{{{{{0+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0+003四元元元元元元元元元\ N{U+0200D}\N{U+1F48B}\N{U+0200D}\N{U+1F469}我只能用Python2.7复制最初的版本,Python2.7是人们不应该再使用的Python版本。
>>> 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
>>> ud.is_normalized('NFC', w)
False
>>> ud.is_normalized('NFD', w)
True