加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 04:34:10 所属栏目:百科 来源:网络整理
导读:我正在使用 Ruby提取文件的URL以下载和下载.文件名有utf8个字符,例如: www.domain.com/.../???ü360ó?ò??úàí.txt 尝试下载上述URL时,它会失败.使用URI :: escape会产生一个也不起作用的URI: www.domain.com/.../%C3%96%C3%87%C3%84%C3%9C360%C3%93%C3
我正在使用 Ruby提取文件的URL以下载和下载.文件名有utf8个字符,例如:
www.domain.com/.../???ü360ó?ò??úàí.txt

尝试下载上述URL时,它会失败.使用URI :: escape会产生一个也不起作用的URI:

www.domain.com/.../%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

但如果我遵循URL Encoding Reference,它的工作原理:

www.domain.com/.../%D6%C7%C4%DC360%D3%EF%D2%F4%D6%FA%C0%ED.txt

我试图在Ruby中搜索一个完全相同编码的函数,但我找不到任何函数.在我尝试编写一个在上面的链接中实现表的函数之前,我想询问是否有人知道任何现有的库来执行此操作.如果我决定这样做,我应该编码什么范围的字符,显然,不是一切.

我正在使用JRuby 1.6.2和RUBY_VERSION => “1.8.7”

解决方法

哦,角色编码的乐趣!

这里发生的事情如下. 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
 => #<Encoding:UTF-8> 
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'
 => "xD6xC7xC4xDC360xD3xEFxD2xF4xD6xFAxC0xED.txt" 
1.9.3-p194 :007 > g.encoding
 => #<Encoding:ISO-8859-1> 
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
 => "303226303207303204303234360303223303257303222303264303226303272303200303255.txt" 
1.8.7 :005 > g = Iconv.conv('iso-8859-1','utf-8',f)
 => "326307304334360323357322364326372300355.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,但显然不是这种情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读