从Rails 3.0.3中的URL正确Unescape特殊字符

pan*_*ggi 7 ruby encoding activerecord escaping ruby-on-rails

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

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

例:

我想搜索:

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

它们都有一个特殊字符:" Å "和" ó ",因此当有人点击搜索按钮时,URL就会生成这样的符号.

?&origin=%C5rhus%2C%20Denmark&destination=Asunci%F3n%2C%20Paraguay
Run Code Online (Sandbox Code Playgroud)

问题:

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

当我在控制台看到时,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
Run Code Online (Sandbox Code Playgroud)

结论:找不到城市 :(

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

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

    请求

    Parameters:
    {"destination"=>"Asunción,
    Paraguay",
    "origin"=>"Århus,
    Denmark",
    "sort"=>"newest"}
    
    Run Code Online (Sandbox Code Playgroud)

这是一个有效的!

题:

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

mu *_*ort 12

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

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

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

如果您无法更改客户端脚本,那么您可以在Ruby中使用force_encoding和执行以下操作encoding:

>> s = CGI.unescape('%C5rhus%2C%20Denmark')
=> "\xC5rhus, Denmark"
>> s.encoding
=> #<Encoding:UTF-8>
>> s.force_encoding('iso-8859-1')
=> "\xC5rhus, Denmark"
>> s.encoding
=> #<Encoding:ISO-8859-1>
>> s.encode!('utf-8')
=> "Århus, Denmark"
>> s.encoding
=> #<Encoding:UTF-8>
Run Code Online (Sandbox Code Playgroud)

你应该得到类似"\xC5rhus, Denmark"params,你可以unmangle与:

s = params[:whatever].force_encoding('iso-8859-1').encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

这个在服务器端处理会是最后的手段不过,如果您的客户端代码被发回编码不正确的数据,那么你会留下猜测的服务器上一堆要弄清楚什么编码的实际使用来获得它进入URL.