用多字符字符串替换字符

时间:2014-07-10 12:37:59

标签: postgresql encoding replace diacritics

我正在尝试替换äüß等德语和荷兰语的变音符号。它们应该写成ae而不是ä。所以我不能简单地将一个字符翻译成另一个字符。

有更优雅的方式吗?实际上它看起来像(尚未完成):

SELECT addr, REPLACE (REPLACE(addr, 'ü','ue'),'ß','ss') FROM search;

在尝试不同命令的过程中,我遇到了另一个问题:

当我搜索Ü时,我得到了这个:

  

错误:编码的字节序列无效" UTF8":0xdc27

U&'\0220'尝试过它,它没有取代任何东西。只有使用ü(小写ü)才能正确替换它。必须用unicode做点什么,但是如何解决这个问题?

来自德国的亲切问候。 :)

2 个答案:

答案 0 :(得分:3)

您的服务器编码似乎是UTF8 我怀疑您的 client_encoding 不匹配,这可能会让您对所处理的内容产生错误的印象。检查:

SHOW client_encoding;   -- in your actual session

阅读相关答案:
Can not insert German characters in Postgres
Replace unicode characters in PostgreSQL

工具链的其余部分也必须同步。例如,当使用puTTY时,必须确保终端同意其余部分:Change settings... Window -> Translation -> Remote character set = UTF-8

至于你的第一个问题,你已经有了最好的解决方案。一些变音符号最好用一串replace()语句替换。

正如您似乎已经知道的那样,单个字符替换对于(单个)translate()语句更有效。

相关:

答案 1 :(得分:0)

除了其他原因,我决定在python中编写替换。就像Erwin之前写的那样,似乎没有比组合replace - 命令更好的解决方案。

一般来说非常简单,即使没有编码也必须使用。我和#34;决赛"解决方案现在看起来像这样:

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))

我现在期待它撞到大桌子时的速度。如果有人想做一些注释,我们非常欢迎。

感谢您的回复和亲切的问候。