从Rails 3.0.3中的URL正确地替换特殊字符

我正在使用Rails 3.0.3和REE(Ruby 1.8.7)和gem’mysql2’,’0.2.6′

我的项目中有一个搜索function,可以让人们使用URL或使用表单来使用GET方法,然后生成URL。

例:

我想搜索:

起源城市:“ Århus,丹麦 ”和目的地城市:“ Asunción,Paraguay

它们都有一个特殊的字符:“ Å ”和“ ó ”,所以当有人点击搜索按钮时,会生成这样的URL。

?&origin=%C5rhus%2C%20Denmark&destination=Asunci%F3n%2C%20Paraguay 

问题:

当我搜索那个城市时,它并没有像我想要的那样(我尝试使用像CGI,URI,甚至一些gem)。

当我在控制台看到时,ActiveRecord收到了这样的查询:

 Parameters: {"destination"=>"Asunci n, Paraguay", "origin"=>" rhus, Denmark", "sort"=>"newest"} City Load (0.1ms) SELECT `cities`.* FROM `cities` WHERE (`cities`.`name` = ' rhus') ORDER BY cities.name ASC City Load (6.8ms) SELECT `cities`.* FROM `cities` WHERE (`cities`.`name` = 'Asunci n, Paraguay') ORDER BY cities.name ASC 

结论:找不到城市 🙁

但是,我发现了一件有趣的事:

  • 当我对与此函数关联的文件发生错误时,输出将如下所示:

    请求

     Parameters: {"destination"=>"Asunción, Paraguay", "origin"=>"Århus, Denmark", "sort"=>"newest"} 

这是一个有效的!

题:

你们有个想法如何解决这个问题吗? 提前致谢 :)

你是对的,看起来你在某处有编码问题。 0xC5字符在ISO-8859-1(AKA Latin-1)中是“Å”,在UTF-8中它在URL中是%C3%85

我怀疑你在客户端使用JavaScript并且你的JavaScript使用旧的escape函数来构建URL, escape有非ASCII字符的一些问题。 如果是这种情况,那么您应该升级JavaScript以使用encodeURIComponent 。 看看这个小小的演示,你会看到我在说什么:

http://jsfiddle.net/ambiguous/U5A3k/

如果您无法更改客户端脚本,那么您可以使用force_encodingencoding在Ruby中以艰难的方式完成:

 >> s = CGI.unescape('%C5rhus%2C%20Denmark') => "\xC5rhus, Denmark" >> s.encoding => # >> s.force_encoding('iso-8859-1') => "\xC5rhus, Denmark" >> s.encoding => # >> s.encode!('utf-8') => "Århus, Denmark" >> s.encoding => # 

你应该从params获得类似"\xC5rhus, Denmark"东西,你可以用以下方法解决这个问题:

 s = params[:whatever].force_encoding('iso-8859-1').encode('utf-8') 

在服务器端处理此问题将是最后的手段,但如果您的客户端代码发送回错误编码的数据,那么您将在服务器上留下一堆猜测来确定实际使用的编码它进入URL。