【问题标题】:What's a good way to replace international characters with their base Latin counterparts using Python?使用 Python 将国际字符替换为基本拉丁字符的好方法是什么?
【发布时间】:2009-07-28 07:21:11
【问题描述】:

假设我有字符串"blöt träbåt",其中有几个ao,上面带有变音符号和环。我希望它尽可能简单地变成"blot trabat"。我做了一些挖掘,发现了以下方法:

import unicodedata
unicode_string = unicodedata.normalize('NFKD', unicode(string))

这将为我提供 unicode 格式的字符串,其中国际字符拆分为基本字母和组合字符(\u0308 表示变音符号。)现在要将其恢复为 ASCII 字符串,我可以执行 ascii_string = unicode_string.encode('ASCII', 'ignore') 它会忽略组合字符,得到字符串"blot trabat"

这里的问题是:有没有更好的方法来做到这一点?感觉就像一个迂回的方式,我在想可能有一些我不知道的东西。我当然可以将它包装在一个辅助函数中,但我宁愿检查它是否在 Python 中已经不存在。

【问题讨论】:

  • "ASCII 字符串 "blöt träbåt"" 是矛盾的。 ASCII 没有重音字符。您的意思是“Unicode 字符串”吗?
  • 嘿,这与我在 C# 中所做的完全一样...
  • 是的,我刚刚意识到我使用了错误的术语。不过,它不一定必须是 Unicode。它可以扩展为 ASCII(这是我真正的意思。)
  • @orsogufo:当我提出这个问题时,最重要的建议是 C# 的解决方案,所以搜索 =)
  • @Blixt:谢谢,我的意思是我已经这样实现了:) 似乎是一种标准方式。只是出于好奇:为什么需要这样做?

标签: python string internationalization


【解决方案1】:

如果您创建一个显式表,然后使用 unicode.translate 方法会更好。优点是音译更精确,例如将“ö”音译为“oe”,将“ß”音译为“ss”,应该用德语做。

PyPI 上有几个音译包:translitcodecUnidecodetrans

【讨论】:

  • 你说得对,音译总比去掉字符的装饰要好。如果"große" 变成"grose",那会很混乱(不是我想我会处理德语单词,但仍然)......
  • 我使用 translitcodec 因为它似乎是最专业的结构化模块。它还与 trans 不同,将 å 替换为 aa,将 ä 替换为 ae,这在音译时是正确的。
  • @Blixt:抱歉,我无法推荐特定的软件包——这可能是一个单独的 SO 问题。但是,您似乎已经进行了评估。
猜你喜欢
  • 1970-01-01
  • 2012-10-08
  • 2023-03-15
  • 2011-01-12
  • 1970-01-01
  • 2017-12-22
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多