带有str .__ len __(x)== 2的单个(带重音)字符

时间:2019-02-11 20:05:31

标签: python-3.6

据我所知,str.__len__(x)在Python 2中由于其字节表示而将重音字符计数加倍,但是在Python 3中却有一次,尽管我在python的str.__len__上找不到合适的文档.org。

Python documentation on stdtypes

Python documentation on len

但是,如果我在Google Colab上运行以下命令,则str.__len__(..)被计为2

example

import sys

test = u'ö'

print(type(test), len(test), sys.version)

str.__len__在哪里记录?

1 个答案:

答案 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)。