gpt4 book ai didi

ruby - URI.escape 的简单替代方案

转载 作者:行者123 更新时间:2023-12-04 10:52:35 25 4
gpt4 key购买 nike

在 URL 上使用 URI.parse 时,我遇到了一条错误消息:

URI::InvalidURIError: URI must be ascii only

我找到了 a StackOverflow question推荐使用 URI.escape,这是有效的。以该问题中的 URL 为例:

URI.parse('http://dxczjjuegupb.cloudfront.net/wp-content/uploads/2017/10/Оуэн-Мэтьюс.jpg')
=> URI::InvalidURIError: URI must be ascii only "http://dxczjjuegupb.cloudfront.net/wp-content/uploads/2017/10/\u041E\u0443\u044D\u043D-\u041C\u044D\u0442\u044C\u044E\u0441.jpg"

URI.encode('http://dxczjjuegupb.cloudfront.net/wp-content/uploads/2017/10/Оуэн-Мэтьюс.jpg')
=> "http://dxczjjuegupb.cloudfront.net/wp-content/uploads/2017/10/%D0%9E%D1%83%D1%8D%D0%BD-%D0%9C%D1%8D%D1%82%D1%8C%D1%8E%D1%81.jpg"

但是,URI.escape 已过时,如 Rubocop警告:

URI.escape method is obsolete and should not be used. Instead, use CGI.escape, URI.encode_www_form or URI.encode_www_form_component depending on your specific use case.

但是虽然 URI.escape 给了我们一个可用的结果,但替代方案却没有:

CGI.escape('http://dxczjjuegupb.cloudfront.net/wp-content/uploads/2017/10/Оуэн-Мэтьюс.jpg')
=> "http%3A%2F%2Fdxczjjuegupb.cloudfront.net%2Fwp-content%2Fuploads%2F2017%2F10%2F%D0%9E%D1%83%D1%8D%D0%BD-%D0%9C%D1%8D%D1%82%D1%8C%D1%8E%D1%81.jpg"

这很麻烦,因为在我的例子中,我正在根据通过 Nokogiri 获得的数据构建一个 URL :

my_url = page.at('.someclass').at('img').attr('src')

因为我只需要转义结果 URL 的最后一部分,但是 CGI.escape 和类似的转换整个字符串(包括必要的字符,例如 :/),现在获取转义结果变成了多行代码的考验,必须拆分路径并使用多个变量来实现以前可以用单个函数完成的操作 ( URI.escape).

有没有我没有看到的简单替代方案?它需要在没有外部 gem 的情况下完成。

最佳答案

我倾向于使用 Addressable用于解析 URL,因为标准 URI 有缺陷:

require 'addressable'

Addressable::URI.parse('http://dxczjjuegupb.cloudfront.net/wp-content/uploads/2017/10/Оуэн-Мэтьюс.jpg')
#<Addressable::URI:0x3fc37ecc1c40 URI:http://dxczjjuegupb.cloudfront.net/wp-content/uploads/2017/10/Оуэн-Мэтьюс.jpg>

Addressable::URI.parse('http://dxczjjuegupb.cloudfront.net/wp-content/uploads/2017/10/Оуэн-Мэтьюс.jpg').path
# "/wp-content/uploads/2017/10/Оуэн-Мэтьюс.jpg"

它不是 Ruby 核心或标准库的一部分,但它应该是,而且它总是在我的 Gemfile 中结束。

关于ruby - URI.escape 的简单替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59402948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com