设置:
我有一个C#程序,该程序在开始时编写一个新的ElasticSearch索引,并将rails应用程序使用的别名指向它,然后该程序继续运行并监视redis实例以更新事物。
还有另一个C#程序会从网页上抓取数据,一旦抓取到的数据就会被放入Postgresql中,并且上面的索引编写器会通过Redis通知。这些页面具有不同的编码,并转换为UTF-8。
该错误的第一次出现是当我犯了一个错误,并将已经是UTF-8的数据再次编码为UTF-8时。
调查
现在,我认为我显然正在进行一些数据损坏,但是奇怪的是:如果我杀死了该进程并从命令行手动启动,则只有当我通过nohup从rails启动indexing mono进程时,变音才损坏。很好。
当我对数据库进行备份/还原时,它可以从Web界面再次工作,但是一旦服务器重新启动,变音符将再次替换为??。从网络界面启动单声道进程时。
我要做的第一件事是从数据库中清除受影响的行并再次刮取数据(无需两次编码),这没有帮助,因为错误仅在通过Rails应用程序通过nohup以非交互方式运行时才会出现我以为是因为语言环境设置,所以我在/ etc / defaults / locale和/ etc / environment中都将其更改为en_US.UTF-8和en_US:en,但这都没有帮助。
我真的不知道我还能做些什么或究竟是什么导致了此错误,所以不胜感激。
编辑:当变音符号替换为??时,我忘了澄清最重要的部分在索引中的每个单个文档中,所有变音符号都会被替换。
最佳答案
将其放在用于启动过程的脚本中:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
您的脚本仅在您手动启动时才选择UTF-8的原因是这些东西不是系统范围的。我以前用jruby和init.d脚本遇到过这种情况,解决方案是不依赖于默认值。
关于encoding - Elasticsearch将变音符号显示为 “??”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19340737/