python - 了解使用编码/解码来去除变音符号
问题描述
我有兴趣学习如何从文本中去除变音符号。也就是说,我试图更好地理解以下代码行中发生的事情,这些代码行是我在 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')
改用?两种编码是否重叠?
解决方案
你的理解大多是正确的。诀窍是.encode('ascii', 'ignore')
。ASCII 只能表示 128 个字符,其中很多甚至无法打印。ASCII 字符集当然不包含带有变音符号的字符。所以它试图将文本强制转换为 ASCII 字符集,并ignore
导致它无法表达的所有字符被静默丢弃;它摆脱了所有那些分解的变音符号。
没错,将其解码为 UTF-8 本身并没有多大意义。将其解码为 ASCII 会更有意义。但是,与许多编码一样,UTF-8 是ASCII的超集。任何有效的 ASCII 字符串也是有效的 UTF-8 字符串、有效的 ISO-8859-1 字符串或许多其他编码的有效字符串。您可以使用任何兼容的编码对其进行解码并获得相同的结果。作者明确选择 UTF-8 是……有点奇怪,但在技术上无关紧要。
推荐阅读
- javascript - 发出多个异步获取请求并找出哪个请求包含字符串匹配
- json - CIRCE:如何使用字段类型中的析取来解码 json 模型
- python - 使用模式迭代列表中的项目?
- regex - 正则表达式展开段落:删除包含内容但不包含空行的行尾的回车和换行
- docker - Ubuntu 16.04 - Docker 已安装但不可用
- spring-boot - 尝试模块化 Gradle SpringBoot 项目,但在尝试构建时出现“错误:找不到符号”?
- snmp - 如何修复:-- snmpget:“加载共享库时出错:libcrypto.so.4:无法打开共享对象文件:没有这样的文件或目录
- python - 如何在 Django 上修复“没有这样的表:PurchaseHistory_purchasehistory”/为什么没有什么要迁移的?
- ipv6 - 如何使用 SNMP 将 IPv4 和 IPv6 地址映射到接口?
- angular - 将视频文件上传到 Firebase 存储