在更长的字符串中,如何在 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),而是两个字符:aU+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')转换为单个字符('å')[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用python正则表达式在字符串中搜索长度为6或更长的特定重复(mnr)

MySQL:如何获得视图的模块化,但优化更长的代码?

如何解析比 NSString 更长的 JSON 文件?

Bcrypt 更长的密码

使用 ImGui 显示更长的字符串 [关闭]

如何在 Powershell 中开始一个比它的父级寿命更长的后台作业?