了解使用 encode/decode 去除变音符号
Understanding the use of encode/decode to strip diacritics
我有兴趣学习如何从文本中去除变音符号。也就是说,我试图更好地理解以下代码行中发生的事情,我在 2017 年的 post (How to replace accented characters in 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')
returns 从给定字节解码的字符串,但这是我卡住的地方。为什么不使用 .decode('ascii')
呢?两种编码是否重叠?
你的理解基本正确。诀窍是.encode('ascii', 'ignore')
。 ASCII 只能表示 128 个字符,其中很多甚至无法打印。 ASCII 字符集肯定不包含带有变音符号的字符。所以它试图将文本强制转换为ASCII字符集,并且ignore
导致所有它无法表达的字符被默默地丢弃;它摆脱了所有那些分解的变音符号。
你是对的,将其解码为 UTF-8 本质上没有多大意义;将其解码为 ASCII 会更有意义。但是,与许多编码一样,UTF-8 是 ASCII 的 超集 。任何有效的 ASCII 字符串也是有效的 UTF-8 字符串,或有效的 ISO-8859-1 字符串,或许多其他编码中的有效字符串。您可以使用这些兼容编码中的任何一种对其进行解码并获得相同的结果。作者明确选择 UTF-8 是……有点奇怪,但在技术上无关紧要。
我有兴趣学习如何从文本中去除变音符号。也就是说,我试图更好地理解以下代码行中发生的事情,我在 2017 年的 post (How to replace accented characters in 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')
returns 从给定字节解码的字符串,但这是我卡住的地方。为什么不使用 .decode('ascii')
呢?两种编码是否重叠?
你的理解基本正确。诀窍是.encode('ascii', 'ignore')
。 ASCII 只能表示 128 个字符,其中很多甚至无法打印。 ASCII 字符集肯定不包含带有变音符号的字符。所以它试图将文本强制转换为ASCII字符集,并且ignore
导致所有它无法表达的字符被默默地丢弃;它摆脱了所有那些分解的变音符号。
你是对的,将其解码为 UTF-8 本质上没有多大意义;将其解码为 ASCII 会更有意义。但是,与许多编码一样,UTF-8 是 ASCII 的 超集 。任何有效的 ASCII 字符串也是有效的 UTF-8 字符串,或有效的 ISO-8859-1 字符串,或许多其他编码中的有效字符串。您可以使用这些兼容编码中的任何一种对其进行解码并获得相同的结果。作者明确选择 UTF-8 是……有点奇怪,但在技术上无关紧要。