在更长的字符串中,如何在 PostgreSQL(和/或 Python 3)中将一个字符(例如,'a')和一个变音字符(例如,'U+030A')转换为单个字符('å')[重复]
Posted
技术标签:
【中文标题】在更长的字符串中,如何在 PostgreSQL(和/或 Python 3)中将一个字符(例如,\'a\')和一个变音字符(例如,\'U+030A\')转换为单个字符(\'å\')[重复]【英文标题】:In a longer string, how to convert a char (e.g., 'a') and a diacritic char (e.g., 'U+030A') into a single char ('å') in PostgreSQL (and/or Python 3) [duplicate]在更长的字符串中,如何在 PostgreSQL(和/或 Python 3)中将一个字符(例如,'a')和一个变音字符(例如,'U+030A')转换为单个字符('å')[重复] 【发布时间】: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 是的,我找到了按钮。它现在应该被标记为重复。再次感谢。 【参考方案1】:根据@Boris 的评论,postgres 中的以下工作:
select initcap(normalize('gunnar pålsen')) as full_name
输出预期的Gunnar Pålsen
。
【讨论】:
以上是关于在更长的字符串中,如何在 PostgreSQL(和/或 Python 3)中将一个字符(例如,'a')和一个变音字符(例如,'U+030A')转换为单个字符('å')[重复]的主要内容,如果未能解决你的问题,请参考以下文章