【发布时间】:2014-07-21 11:14:51
【问题描述】:
我有大量带有苏格兰和威尔士口音的地名(结合了严重、急性、抑扬符和 diareses),我需要将它们更新为它们的 unicode 规范化形式,例如,á 的较短形式 00E1 (\xe1)而不是 0061 + 0301 (\x61\x301)
我从 2009 年的旧 Postgres nabble 邮件列表中找到了一个解决方案,使用 pl/python,
create or replace function unicode_normalize(str text) returns text as $$
import unicodedata
return unicodedata.normalize('NFC', str.decode('UTF-8'))
$$ LANGUAGE PLPYTHONU;
这正如预期的那样有效,但让我想知道是否有任何方法可以直接使用内置的 Postgres 函数。我用convert_to尝试了各种转换,都是徒劳的。
编辑:正如 Craig 所指出的,以及我尝试过的一件事:
SELECT convert_to(E'\u00E1', 'iso-8859-1');
返回\xe1,而
SELECT convert_to(E'\u0061\u0301', 'iso-8859-1');
ERROR: character 0xcc81 of encoding "UTF8" has no equivalent in "LATIN1"
失败
【问题讨论】:
-
所以你想要 precomposed 而不是 decomposed 形式?如
SELECT E'\u00E1', E'\u0061\u0301'; -
嗯。有趣的。我希望 Pg 在
convert_to之前进行组合和规范化,但事实并非如此。坦率地说,这似乎是一个错误,因为这意味着convert_to(E'\u0061\u0301', 'iso-8859-1');失败但convert_to(E'\u00E1', 'iso-8859-1')成功。 -
@Craig,是的,第一条评论。是的,我尝试了这些转换并得到“在 LATIN1 中没有等效项”错误。如果您认为这是一个错误,您可以将其发布为答案,以便我接受吗?
-
让我们先看看有没有其他人有想法。
-
@CraigRinger,好主意。我很高兴在 convert_to 函数中没有遗漏任何明显的东西。
标签: postgresql unicode plpython