【问题标题】:Replace characters with multi-character strings用多字符串替换字符
【发布时间】:2014-08-31 20:13:01
【问题描述】:

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

有没有更优雅的方法来做到这一点?实际上看起来是这样的(尚未完成):

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

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

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

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

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

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

【问题讨论】:

  • Unicode 转义序列是十六进制的;你想要U&'\00DC'

标签: postgresql encoding replace diacritics


【解决方案1】:

您的服务器编码似乎是 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() 语句替换单个字符更有效。

相关:

【讨论】:

  • 我不太确定客户端/服务器编码不匹配。根据我的经验,这些类型的映射失败通常会给出“字符没有等效”错误。 “无效字节序列”听起来更像是client_encoding设置为UTF8,但客户端程序仍在发送ANSI数据。
  • @NickBarnes:嗯,客户端发送的数据按照clent_encoding编码。 client_encoding 是双向的。所以我们可能在这里谈论同样的事情。
  • 不完全。服务器根据client_encoding解释客户端的数据,但客户端可以发送任何它想要的。例如,如果我在 Windows 中启动 psql,它默认为 WIN1252。如果我运行SET client_encoding TO 'UTF8'SELECT 'Ü',我会收到“无效字节序列”错误。 psql 不知道发生了什么变化;它仍在以 ANSI 格式发送数据。
  • @NickBarnes:好点。我在上一条评论中的描述不太正确。例如,当使用 puTTY 时,必须确保终端同意其余的……Change settings... Window -> Translation -> Remote character set: UTF-8
  • @Erwin:这就是重点。我正在使用 SuperPutty,必须将字符集更改为 UTF-8。虽然问题应该得到解决 - 但是:在街道内选择一个带有元音变音的地址,元音变音仍然无法正确显示。相反,我得到的是Ã 而不是ß。不过,我的问题解决了。谢谢大家!
【解决方案2】:

除了其他原因,我决定用 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))

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-15
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多