ruby mysql ascii_ruby – 如何对ASCII字符进行URL编码?

哦,角色编码的乐趣!

这里发生的事情如下. Ruby内部将您提取的字符串存储为字节序列,该字节序列是文件名的utf-8编码.当你在其上调用URI.escape时,这些字节以%xy格式转义,结果字符串(现在只包含ASCII范围内的字节)用作url.

然而,接收服务器正在解释这些字节(在从%xy表单中取消它们之后),好像它们处于不同的编码中,在这种情况下是ISO-8859-1,因此它所提供的结果文件名与它所具有的任何内容都不匹配.

这是使用Ruby 1.9的演示,因为它更好地支持编码.

1.9.3-p194 :003 > f

=> "ÖÇÄÜ360ÓïÒôÖúÀí.txt"

1.9.3-p194 :004 > f.encoding

=> #

1.9.3-p194 :005 > URI.escape f

=> "%C3%96%C3%87%C3%84%C3%9C360%C3%93%C3%AF%C3%92%C3%B4%C3%96%C3%BA%C3%80%C3%AD.txt"

1.9.3-p194 :006 > g = f.encode 'iso-8859-1'

=> "\xD6\xC7\xC4\xDC360\xD3\xEF\xD2\xF4\xD6\xFA\xC0\xED.txt"

1.9.3-p194 :007 > g.encoding

=> #

1.9.3-p194 :008 > URI.escape g

=> "%D6%C7%C4%DC360%D3%EF%D2%F4%D6%FA%C0%ED.txt"

因此,在这种情况下的解决方案是在转义字符串之前将字符串编码为ISO-8859-1.在Ruby 1.9中你可以像上面这样做,在早期版本中你可以使用Iconv(我假设JRuby包含Iconv,我实际上并不熟悉JRuby):

1.8.7 :001 > f

=> "\303\226\303\207\303\204\303\234360\303\223\303\257\303\222\303\264\303\226\303\272\303\200\303\255.txt"

1.8.7 :005 > g = Iconv.conv('iso-8859-1','utf-8',f)

=> "\326\307\304\334360\323\357\322\364\326\372\300\355.txt"

1.8.7 :006 > URI.escape f

=> "%C3%96%C3%87%C3%84%C3%9C360%C3%93%C3%AF%C3%92%C3%B4%C3%96%C3%BA%C3%80%C3%AD.txt"

1.8.7 :007 > URI.escape g

=> "%D6%C7%C4%DC360%D3%EF%D2%F4%D6%FA%C0%ED.txt"

请注意,通常您不能使用任何特定编码依赖服务器.应该使用utf-8,但显然不是这种情况.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值