【发布时间】:2021-10-06 08:29:45
【问题描述】:
我在 postgres 中使用 initcap() 函数时,我注意到对于某些名称,例如 gunnar pålsen,它会输出 Gunnar PåLsen(大写 L),其他时候它会正确地为一样的名字。在调查时我注意到å 实际上不是一个字符(U+00E5),而是两个字符:a(U+0061)和变音符号U+030A(ref)。
有没有一种简单/优雅的方法可以将这样的两个字符转换为一个字符?它也应该适用于其他版本,例如 é 和 ö。
我目前的解决方案是这样的:
select
initcap(
replace(
replace(
replace(
replace(
replace(
replace(
replace(
lower(person.full_name),
'á', 'á'
),
'ö', 'ö'
),
'å', 'å'
),
'é', 'é'
),
'è', 'è'
),
'ä', 'ä'
),
'ü', 'ü'
)
) as full_name
from person
这不是很强大,可能会出现新的组合。 (请注意,这里的复制粘贴似乎已经成功转换了字符,所以假设左边的一个是两个字符,一个有变音符号。)
我也尝试使用translate(),但我认为它不会起作用,因为它似乎需要在单个字符之间进行翻译,而在这种情况下,我们是从二到一。
python 的解决方案也是可以接受的。部分数据流通过 python 进行,所以如果需要我可以在那里修复它。最好使用 postgres 解决方案。
【问题讨论】:
-
Unicode 称之为Unicode normalization。
-
谢谢它似乎在 postgres 中是这样的:SELECT NORMALIZE('Pål');
-
@Boris 是的。好像我根本不知道要搜索的正确单词。不确定我们是否应该关闭这个问题。如果您想回答,我可以接受它作为正确答案。
-
我将其标记为重复,您没有办法接受该标记吗?或者您也可以点击问题下方的灰色“关闭”并将其标记为重复。
-
@Boris 是的,我找到了按钮。它现在应该被标记为重复。再次感谢。
标签: python postgresql character-encoding diacritics