Python 和字符规范化

发布于 2024-10-02 10:13:24 字数 143 浏览 2 评论 0原文

你好 我从外部源检索基于文本的 utf8 数据,其中包含特殊字符,例如 u"ıöüç",同时我想将它们规范化为英语,例如 "ıöüç" -> “iouc” 。实现这一目标的最佳方法是什么?

Hello
I retrieve text based utf8 data from a foreign source which contains special chars such as u"ıöüç" while I want to normalize them to English such as "ıöüç" -> "iouc" . What would be the best way to achieve this ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

兰花执着 2024-10-09 10:13:24

我建议使用 Unidecode 模块

>>> from unidecode import unidecode
>>> unidecode(u'ıöüç')
'iouc'

注意如何向其提供 unicode 字符串并输出字节字符串。保证输出为 ASCII。

I recommend using Unidecode module:

>>> from unidecode import unidecode
>>> unidecode(u'ıöüç')
'iouc'

Note how you feed it a unicode string and it outputs a byte string. The output is guaranteed to be ASCII.

梦情居士 2024-10-09 10:13:24

这完全取决于您想要对结果进行音译的程度。如果您想将所有内容全部转换为 ASCII(αβγabg),那么 unidecode 就是您的最佳选择。

如果您只想删除重音字母中的重音,那么您可以尝试使用规范化形式 NFKD 分解字符串(这会将重音字母 á 转换为纯字母 a ,然后是U+0301 组合尖锐重音),然后丢弃重音(属于 Unicode 字符类 Mn —“标记,非空格”)。

import unicodedata

def remove_nonspacing_marks(s):
    "Decompose the unicode string s and remove non-spacing marks."
    return ''.join(c for c in unicodedata.normalize('NFKD', s)
                   if unicodedata.category(c) != 'Mn')

It all depends on how far you want to go in transliterating the result. If you want to convert everything all the way to ASCII (αβγ to abg) then unidecode is the way to go.

If you just want to remove accents from accented letters, then you could try decomposing your string using normalization form NFKD (this converts the accented letter á to a plain letter a followed by U+0301 COMBINING ACUTE ACCENT) and then discarding the accents (which belong to the Unicode character class Mn — "Mark, nonspacing").

import unicodedata

def remove_nonspacing_marks(s):
    "Decompose the unicode string s and remove non-spacing marks."
    return ''.join(c for c in unicodedata.normalize('NFKD', s)
                   if unicodedata.category(c) != 'Mn')
浅黛梨妆こ 2024-10-09 10:13:24

我发现的最简单的方法:

unicodedata.normalize('NFKD', s).encode("ascii", "ignore")

The simplest way I found:

unicodedata.normalize('NFKD', s).encode("ascii", "ignore")

や三分注定 2024-10-09 10:13:24
import unicodedata
unicodedata.normalize()

http://docs.python.org/library/unicodedata.html

import unicodedata
unicodedata.normalize()

http://docs.python.org/library/unicodedata.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文