require 'uri'
uri = URI.parse 'http://dxczjjuegupb.cloudfront.net/wp-content/uploads/2017/10/Оуэн-Мэтьюс.jpg'
浏览器对http://dxczjjuegupb.cloudfront.net/wp-content/uploads/2017/10/Оуэн-Мэтьюс.jpg没有问题,所以我问自己这个ruby类是否有点过时了?我应该完全放弃它还是做一些错误处理......
答案 0 :(得分:15)
答案刚刚问我自己这个问题:
begin
uri = URI.parse(url)
rescue URI::InvalidURIError
uri = URI.parse(URI.escape(url))
end
答案 1 :(得分:3)
感谢所有 URI.escape
(也称为 URI.encode
),这些方法已被 Ruby 2.7 正式淘汰 - 即它们现在产生一个可见的 {{ 1}} 使用它们时的警告消息 - 以前它们刚刚被弃用。
不幸的是,据我所知,Ruby 的标准库 URI.escape is obsolete
类没有提供任何替代方法来处理包含非 ASCII 字符的 URI,这些 URI 在当今非常普遍 -
我想出的最佳解决方案是使用包含我们应得的 URI
类的 addressable gem - 它处理世界上所有必须扔给它的东西,您可以获得“HTTP 安全”使用 URI
方法的 URI:
#display_uri
Addressable::URI.parse("http://example.com/Оуэн-Мэтьюс.jpg")
=> #<Addressable::URI:0xc8 URI:http://example.com/Оуэн-Мэтьюс.jpg>
Addressable::URI.parse("http://example.com/Оуэн-Мэтьюс.jpg").display_uri.to_s
=> "http://example.com/%D0%9E%D1%83%D1%8D%D0%BD-%D0%9C%D1%8D%D1%82%D1%8C%D1%8E%D1%81.jpg"
还带有各种好东西,例如端口推断(您可以判断 URL 最初是否包含端口规范,或者您可以不在乎)和 URL 规范化(给定一个基本 URL,取一个可能的相对 URL 并生成一个绝对 URL)。
以下是如何将其与 Addressable::URI
结合使用:
net/http
答案 2 :(得分:1)
我有同样的错误:
Ruby:URI :: InvalidURIError(URI必须仅是ascii
使用我的代码,但我的错误是这是一个旧项目,而i18n已过时。解决了,方法很简单:
bundle update
答案 3 :(得分:1)
您如何看待:
url = URI.escape(url) unless url.ascii_only?
URI.parse(url)