首页 > 解决方案 > 了解使用编码/解码来去除变音符号

问题描述

我有兴趣学习如何从文本中去除变音符号。也就是说,我试图更好地理解以下代码行中发生的事情,这些代码行是我在 2017 年的一篇文章中发现的(如何在 python 中替换重音字符?):

import unicodedata

text = unicodedata.normalize('NFD', text).encode('ascii','ignore').decode('utf-8')

以下是我的粗略理解:

unicodedata.normalize('NFD',text)将每个字符转换为其分解形式(例如 à 变为 a),.

.encode('ascii','ignore')将规范化文本转换为 ascii 字节字符串 ( b'string') 并忽略任何错误。

.decode('utf-8')返回从给定字节解码的字符串,但这是我卡住的地方。为什么不.decode('ascii')改用?两种编码是否重叠?

标签: pythondecodeencodediacritics

解决方案


你的理解大多是正确的。诀窍是.encode('ascii', 'ignore')。ASCII 只能表示 128 个字符,其中很多甚至无法打印。ASCII 字符集当然不包含带有变音符号的字符。所以它试图将文本强制转换为 ASCII 字符集,并ignore导致它无法表达的所有字符被静默丢弃;它摆脱了所有那些分解的变音符号。

没错,将其解码为 UTF-8 本身并没有多大意义。将其解码为 ASCII 会更有意义。但是,与许多编码一样,UTF-8 是ASCII的超集。任何有效的 ASCII 字符串也是有效的 UTF-8 字符串、有效的 ISO-8859-1 字符串或许多其他编码的有效字符串。您可以使用任何兼容的编码对其进行解码并获得相同的结果。作者明确选择 UTF-8 是……有点奇怪,但在技术上无关紧要。


推荐阅读