Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从字符串中获取字符-获取错误的字符和错误的字符串长度_Python_String_Unicode - Fatal编程技术网

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允许在编码字符时有很大的灵活性。在这

下面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允许在编码字符时有很大的灵活性。在这种情况下,
实际上由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字符串。字符串的python
len()
方法计算代码点。第二个字符使用了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