0

设置:

  • 通过 VMWare 快速安装安装的 Ubuntu 12.04 服务器
  • PostgreSQL 9.1
  • 弹性搜索 0.90
  • 单声道 3.2.1
  • 导轨 4
  • Nginx 1.4.2 + 乘客 4.0.16

我有一个 C# 程序,它在开始时写入一个新的 ElasticSearch 索引并将 rails 应用程序使用的别名指向它,然后程序继续运行并监视 redis 实例以进行更新。

还有另一个 C# 程序从网页中抓取数据,一旦被抓取,它们就会被放入 Postgresql 并通过 Redis 通知上面的索引编写器。这些页面具有不同的编码并转换为 UTF-8。

这个错误的第一次出现是当我犯了一个错误并将已经是 UTF-8 的数据再次编码为 UTF-8 时。

调查

现在我认为我显然有一些数据损坏,但奇怪的是:只有当我通过 nohup 从 rails 启动索引单声道进程时,元音变音才会损坏,如果我杀死这个进程并从命令行手动启动它就可以了完全没问题。

当我对数据库进行备份/恢复时,它再次从 Web 界面工作,但是一旦服务器重新启动,变音符号再次被替换为 ?? 从 Web 界面启动单声道进程时。

我做的第一件事是从数据库中清除受影响的行并再次刮取数据(不对其进行两次编码),这没有帮助,因为该错误仅在通过 rails 应用程序中的 nohup 以非交互方式运行时出现我认为这是因为语言环境设置,所以我将 /etc/defaults/locale 和 /etc/environment 都更改为 en_US.UTF-8 和 en_US:en 但这也没有帮助。

我真的不知道我还能做什么或究竟是什么导致了这个错误,任何帮助将不胜感激。

编辑:我忘了澄清最重要的部分,当变音符号被替换为 ?? 索引中的每个文档中的所有变音符号都会被替换。

4

1 回答 1

1

将其放入用于启动进程的脚本中:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

当您手动启动时,您的脚本只选择 UTF-8 的原因是这些东西不是系统范围的。我之前使用 jruby 和 init.d 脚本遇到过这个问题,解决方案是不依赖默认值。

于 2013-10-13T12:48:10.330 回答