用于 Unicode 字符的 Python 3 len() 函数

neh*_*iah 5 python unicode tamil python-3.x

当我们相信 Python 3 在 Unicode 上一切正常时,我在面对这种情况时感到惊讶。

\n\n
>>> amma = "\xe0\xae\x85\xe0\xae\xae\xe0\xaf\x8d\xe0\xae\xae\xe0\xae\xbe"\n>>> amma\n\'\xe0\xae\x85\xe0\xae\xae\xe0\xaf\x8d\xe0\xae\xae\xe0\xae\xbe\'\n>>> len(amma)\n5\n
Run Code Online (Sandbox Code Playgroud)\n\n

显然,泰米尔语字符串"\xe0\xae\x85\xe0\xae\xae\xe0\xaf\x8d\xe0\xae\xae\xe0\xae\xbe"有 3 个字母,返回值 5 是len("\xe0\xae\x85\xe0\xae\xae\xe0\xaf\x8d\xe0\xae\xae\xe0\xae\xbe")无法接受或欣赏的。

\n\n

其他德拉威语或婆罗米语脚本如何解决此问题以获得正确的字符串长度?

\n\n

编辑#1:\n考虑到@joey 的评论,这个问题可以改写如下。

\n\n

如何在Python中计算字素长度?

\n\n

我们知道 Swift 或 Perl6 默认情况下会这样做

\n\n
  2> let amma = "\xe0\xae\x85\xe0\xae\xae\xe0\xaf\x8d\xe0\xae\xae\xe0\xae\xbe".characters.count\namma: Distance = 3\n
Run Code Online (Sandbox Code Playgroud)\n

Ign*_*ams 2

它可能有 3 个字母,但它有 5 个字符:

\n\n
$ charinfo '\xe0\xae\x85\xe0\xae\xae\xe0\xaf\x8d\xe0\xae\xae\xe0\xae\xbe'\nU+0B85 TAMIL LETTER A [Lo]\nU+0BAE TAMIL LETTER MA [Lo]\nU+0BCD TAMIL SIGN VIRAMA [Mn]\nU+0BAE TAMIL LETTER MA [Lo]\nU+0BBE TAMIL VOWEL SIGN AA [Mc]\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您需要更具体,那么您只需计算“字母”类别中的字符数。

\n

  • 更准确地说:3 个字素,但 5 个代码点。不过,在 Python 中计算字符串中的字素似乎有点复杂(找不到任何好的示例)。 (3认同)