用多个字符字符串替换字符

4
我正在尝试替换德语和荷兰语的变音符,例如äüß。它们应该写成ae,而不是ä。所以我不能简单地将一个字符翻译为另一个字符。
有没有更优雅的方法来实现这一点?实际上看起来像这样(尚未完成):
SELECT addr, REPLACE (REPLACE(addr, 'ü','ue'),'ß','ss') FROM search;

在尝试不同命令的过程中,我遇到了另一个问题:
当我搜索Ü时,出现了以下错误:

ERROR: invalid byte sequence for encoding "UTF8": 0xdc27

我试过用U&'\0220',但没有替换任何内容。只有使用ü(对于小写的ü)才能正确替换。这与Unicode有关,但如何解决这个问题呢?
来自德国的诚挚问候。 :)

1
Unicode转义序列是十六进制的;您需要使用U&'\00DC' - Nick Barnes
2个回答

3

您的服务器编码似乎是UTF8。
我怀疑您的client_encoding不匹配,这可能会给您处理问题带来错误印象。请检查:

SHOW client_encoding;   -- in your actual session

请阅读以下相关答案:
无法在Postgres中插入德语字符
在PostgreSQL中替换Unicode字符

工具链的其余部分也必须保持同步。例如,使用puTTY时,人们必须确保终端与其余部分一致:更改设置... 窗口 -> 翻译 -> 远程字符集=UTF-8

至于您的第一个问题,您已经有了最佳解决方案。几个umlauts最好用字符串的replace()语句替换。

正如您已经知道的那样,单个字符替换使用(单个)translate()语句更有效率。

相关:


我对客户端/服务器编码不匹配并不确定。根据我的经验,这种映射失败通常会导致“字符没有等价物”的错误。 “无效的字节序列”更像是将client_encoding设置为UTF8,但客户端程序仍在发送ANSI数据。 - Nick Barnes
@NickBarnes:嗯,客户端根据“client_encoding”编码发送数据。“client_encoding”是双向的。所以我们可能在谈论同一件事情。 - Erwin Brandstetter
1
不完全正确。服务器根据 client_encoding 解释客户端的数据,但客户端可以发送任何它想要的内容。例如,如果我在 Windows 上启动 psql,它默认为 WIN1252。如果我运行 SET client_encoding TO 'UTF8'SELECT 'Ü',我会得到一个“无效的字节序列”错误。psql 不知道任何事情已经改变;它仍然将其数据作为 ANSI 发送。 - Nick Barnes
@NickBarnes:说得好。我在之前的评论中描述不太正确。例如,使用puTTY时,必须确保终端与其他内容一致...更改设置...窗口->翻译->远程字符集:UTF-8 - Erwin Brandstetter
1
@Erwin:这就是问题所在。我正在使用SuperPutty,并不得不将字符集更改为UTF-8。虽然问题应该已经解决了,但是:如果选择一个带有街道内部的变音符号的地址,则变音符号仍然无法正确显示。相反,我得到的是Ã而不是ß。不过,我的问题已经解决了。谢谢大家! - Stefan
@Stefan:一旦您在表格中输入了不正确的数据,那么它就会一直存在,直到您修复它。 - Erwin Brandstetter

0

除了其他原因,我决定用Python编写替换程序。正如Erwin之前所说,似乎没有比组合replace命令更好的解决方案。

总体上非常简单,甚至不需要使用编码。我的“最终”解决方案现在看起来像这样:

ger_UE="Ü"
ger_AE="Ä"
ger_OE="Ö"
ger_SS="ß"

dk_AA="Å"
dk_OE="Ø"
dk_AE="Æ"

cur.execute("""Select addr, REPLACE (REPLACE (REPLACE( REPLACE (REPLACE (REPLACE (REPLACE(addr, '%s','UE'),'%s','OE'),'%s','AE'),'%s','SS'),'%s','AA'),'%s','OE'),'%s','AE')
  from search WHERE x = '1';"""%(ger_UE,ger_OE,ger_AE,ger_SS,dk_AA,dk_OE,dk_AE))

我现在期待着它达到大表格的速度。如果有人想做一些注释,欢迎。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接