【问题标题】:Understanding the use of encode/decode to strip diacritics了解使用编码/解码来去除变音符号
【发布时间】:2019-10-02 07:33:20
【问题描述】:

我有兴趣学习如何从文本中去除变音符号。也就是说,我正试图更好地理解以下代码行中发生的事情,这是我在 2017 年的一篇文章中发现的 (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') 返回从给定字节解码的字符串,但这是我卡住的地方。为什么不改用.decode('ascii')?两种编码是否重叠?

【问题讨论】:

    标签: python decode encode diacritics


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多