UTF-8字符在生产环境中的处理方式不同

时间:2014-10-01 18:51:12

标签: ruby-on-rails http ruby-on-rails-4 utf-8 thinking-sphinx

在我的本地计算机上,我可以搜索“Härtefälle”,这将生成以下网址:

开发

http://myapp.dev/de/incoming?q=H%E4rtef%E4llen

我可以根据需要提交多次,看起来总是正确的:

correct

的信息:

Mac OSX 10.9.5
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
thinking-sphinx (3.1.1)
rails (4.0.4)
/usr/local/Cellar/sphinx/2.2.4

locale命令:

LANG=
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

生产

但是在我的生产环境中,当我输入搜索词并单击“应用”时,我得到以下结果:

weird1

好奇地,当我一直按下Apply时,这个词变得更大,更奇怪,但不知何故,搜索引擎仍然能够在这个奇怪的HÃÂâ¬rtefÃÂâ¬llen后面看到“Härtefällen”一词,因为显示了相应的搜索结果:

weird2

weird3

的信息:

Debian 7.0
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
rails (4.0.4)
thinking-sphinx (3.1.1)
Package: sphinxsearch Version: 2.0.4-1.1

locale命令:

LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

底线

我在控制器中唯一能做的就是取消搜索参数H%E4rtef%E4llen

# TODO: Somehow `René` turns into `Ren\xE4`
params[:q] = params[:q].encode('UTF-8', 'ISO-8859-15') rescue nil

现在我如何在生产中获得理智的行为?如果我能提供更多相关信息,请通知我。

1 个答案:

答案 0 :(得分:0)

我弄清楚我做错了什么:

  1. 我有一个用于将数据发布到服务器的表单
  2. 服务器重定向到使用GET参数的新网址
  3. 在步骤1中,字符已正确编码,但对于我构成新网址的步骤2,我需要使用URI.encode转义网址:

    URI.encode(myURL)

  4. 所以,例如ö变为%C3%B6