在Python3中更正一串非英文字符的长度

问题描述 投票:2回答:4

我在一个文件中给了一串希伯来字符(以及其他一些阿拉伯字符。我都不知道它们)

Tzor

当我从Python3中的文件加载此字符串时

fin = open("filename")
x = next(fin).strip()

x的长度似乎是5

>>> len(x)
5

它的unicode utf-8编码是

>>> x.encode("utf-8")
b'\xd7\xa6\xd7\x95\xd6\xb9\xd7\xa8\xe2\x80\x8e'

但是,在浏览器中,很明显这些希伯来字符的长度为3。

如何正确地获得长度?为什么会发生这种情况?

我知道Python 3默认是unicode所以我没想到会出现这样的问题。

python python-3.x python-unicode
4个回答
5
投票

原因是包含的文本包含控制字符\u200e,它是一个用作Left-to-right标记的不可见字符(当你有多种语言混合在左到右和从右到左之间划分时常用)。另外,它包括元音“字符”(第二个字符上方的小点,表示如何发音)。

例如,如果用空字符串替换LTR标记,则长度为4:

>> x = 'צוֹר'
>> x
'צוֹר\u200e' # note the control character escape sequence
>> print(len(x))
5

>> print(len(x.replace('\u200e', ''))
4

如果你只需要严格的字母字符和空格字符的长度,你可以做re.sub所有非空格非单词字符:

>> print(len(re.sub('[^\w\s]', '', x)))
3

4
投票

Unicode字符具有不同的类别。在你的情况下:

>>> import unicodedata
>>> s = b'\xd7\xa6\xd7\x95\xd6\xb9\xd7\xa8\xe2\x80\x8e'.decode("utf-8")
>>> list(unicodedata.category(c) for c in s)
['Lo', 'Lo', 'Mn', 'Lo', 'Cf']
  • Lo:信,其他(不是大写,小写等)。这些是“真正的”角色
  • Mn:马克,没有间距。这是某种类型的重音字符与前一个字符相结合
  • Cf:控制,格式。在这里,它切换回从左到右的写入方向

0
投票

你试过qazxsw poi库吗?

io

你也可以尝试>>> import io >>> with io.open('text.txt', mode="r", encoding="utf-8") as f: x = f.read() >>> print(len(x))

codecs

0
投票

使用utf-8编码打开文件。

>>> import codecs
>>> with codecs.open('text.txt', 'r', 'utf-8') as f:
     x = f.read()
>>> print(len(x))

要么

fin = open('filename','r',encoding='utf-8')
© www.soinside.com 2019 - 2024. All rights reserved.