Ruby:URI :: InvalidURIError(URI必须仅为ascii

时间:2017-10-20 12:36:04

标签: ruby

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类是否有点过时了?我应该完全放弃它还是做一些错误处理......

4 个答案:

答案 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)