据我所知,str.__len__(x)
在Python 2中由于其字节表示而将重音字符计数加倍,但是在Python 3中却有一次,尽管我在python的str.__len__
上找不到合适的文档.org。
Python documentation on stdtypes
但是,如果我在Google Colab上运行以下命令,则str.__len__(..)
被计为2
import sys
test = u'ö'
print(type(test), len(test), sys.version)
str.__len__
在哪里记录?
答案 0 :(得分:2)
有两种方法来表示Unicode中的符号“ö”。一个是带有DIAERESIS的U + 00F6拉丁文小写字母O。另一个是U + 006F拉丁文小写字母O,然后是U + 0308组合直径。如果将源文件限制为ASCII,则这些文件可以分别表示为"\u00f6"
和"o\u0308"
。
在第一种情况下,我的长度为1。在第二种情况下,我的长度为2(使用Python 3.7.2测试)。我怀疑您的代码正在使用第二种表示形式。
这与documentation for the string type匹配,后者指出“字符串是Unicode代码点的不可变序列”(强调我的意思)。因此,由两个代码点组成的表示形式的长度为2。
您可以使用unicodedata.normalize
函数在两种形式之间进行转换。将"NFC"
用于form参数将转换为组合表示形式(长度1),使用"NFD"
将其分解为字母和组合字符(长度2)。