我有大量带有苏格兰和威尔士口音的地名(包括重音、尖音符、抑扬符和分音符),需要将它们更新为它们的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');
使用UTF8编码的字符0xcc81在LATIN1中没有相应的字符,因此出现错误:ERROR: character 0xcc81 of encoding "UTF8" has no equivalent in "LATIN1"
convert_to
之前进行组成和规范化,但实际上它并没有。这似乎是一个错误,因为这意味着convert_to(E'\u0061\u0301', 'iso-8859-1')
会失败,但convert_to(E'\u00E1', 'iso-8859-1')
会成功。 - Craig Ringer