无法正确读取文件中未编码的文本,缺少空格,字符错误

时间:2019-05-24 07:27:07

标签: python python-3.x unicode fonts terminal

我正在清除.txt文件的文本。但是,阅读文件后,我发现文本缺少空格,并且仅在某些单词之间出现了错误的字符。

我正在使用Python 3,文本为越南语。

Orignial text: "vui lòng cởi đồ ra tôi muốn nghe khám bệnh"
In[1]: with open('test.txt') as f:
          read_text = f.read()
       read_text
Out[1] vui lòng cởi đô`ra tôi muốn nghe khám bệnh

仔细查看“đồra”->“đô`ra”。字符“ồ”变成两个字符:“ô”和“`”。

当我使用re删除所有特殊字符时

In[2]: import re
       read_text = re.sub('\W+',' ',read_text)
       read_text
Out[2]: vui lo ng cơ i đô ra tôi muô n nghe kha m bê nh

结果应与原始结果相同,但不是。怎么了?

1 个答案:

答案 0 :(得分:0)

问题不在Python语言中- 问题是您所指向的特定字符(可能还有其他字符)具有两个组合的变音标记。问题是并非所有的文本处理应用程序都可以处理该问题。我本人正在使用基于Qt的终端,只需将您问题中的第一个字符串粘贴到第二个变音符号“消失”处,即“消失”,仅保留“ô”标记即可。 (不过,基于GTK +的终端可以正确处理它。)

所以,事实是,Python提供的unicode字符串是正确的。您用来查看它的终端应用程序无法正确处理,但是在同一个字符上放置了两个变音符号。

过滤变音符使其远离Unicode字符几乎绝不是“正确的事情”。如果您的应用程序支持越南文字,则应正确执行此操作,而不是静默转换某些字符。

对于“基于西方的”语言,字母通常具有一个变音符,这很容易-不仅终端和输出库支持那么变音,而且通常所有字符都由单个unicode-codepoint表示。

但是,当每个字符需要更多变音符时,将“字符串中的一个字符”的等效性等同于“屏幕上的一个字符”(不管输出是否正确)。然后您必须担心代码中的问题。

如果您只是将事物编入索引以进行搜索,甚至是为训练而使用文本语料库,也可以去除变音符号,但是也许您应该去除所有变音符号。

执行此操作的方法是将字符串强制为标准化的Unicode表示形式,其中所有变音符号均表示为单独的“组合字符”而不是组成字符,然后仅过滤出字母字符;

import unicodedata
a = "vui lòng cởi đồ ra tôi muốn nghe khám bệnh"

# Normalize the internal representation:
b = unicodedata.normalize("NFKD", a)
print(*(c for c in b), sep=" ")
# outputs: "v u i   l o ̀ n g   c o ̛ ̉ i   đ o ̂ ̀   r a   t o ̂ i   m u o ̂ ́ n   n g h e   k h a ́ m   b e ̣ ̂ n h"

# recreates the string filtering out combining characters:
c = "".join(c for c in b if unicodedata.category(c) != "Mn")
print(c)
# outputs: 'vui long coi đo ra toi muon nghe kham benh'