Python “反规范化” Unicode 组合字符

4 投票
2 回答
2195 浏览
提问于 2025-04-16 00:29

我想在Python中对一些Unicode文本进行标准化。我在想有没有简单的方法可以得到一个组合Unicode字符的“非标准化”形式?比如说,如果我有这个序列u'o\xaf'(也就是拉丁小写字母o后面跟着组合长音符),我想得到ō(带长音符的拉丁小写字母o)。反向操作就简单多了:

o = unicodedata.lookup("LATIN SMALL LETTER O WITH MACRON")
o = unicodedata.normalize('NFD', o)

2 个回答

4

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后把它放到另一个地方。这就像是把书从一个书架搬到另一个书架一样。

有些时候,我们会遇到一些问题,比如数据的格式不对,或者我们需要对数据进行一些处理才能使用。这就像是你在搬书的时候,发现有些书是倒着放的,你需要把它们翻过来才能放到新的书架上。

在这个过程中,我们可能会用到一些工具或者方法来帮助我们完成这些任务。就像搬家时,你可能会用到手推车来搬重的东西,这样会轻松很多。

总之,处理数据就像是搬书一样,需要一些技巧和工具,才能把它们放到正确的位置,方便我们使用。

o = unicodedata.normalize('NFC', o)
5

正如我之前提到的,U+00AF 不是一个组合的长音符。不过,你可以通过 NFKD 转换把它变成 U+0020 和 U+0304。

>>> unicodedata.normalize('NFKD', u'o\u00af')
u'o \u0304'

然后你可以去掉空格,使用 NFC 得到 ō。


(注意,NFKD 在分解时比较激进,有些语义可能会丢失——任何“兼容”的字符都会被分开。例如:

  • '½' (U+008D) 变成 '1' '⁄' (U+2044) '2';
  • '²' (U+00B2) 变成 '2'
  • '①' (U+2460) 变成 '1'

等等。)

撰写回答