如何在Ruby的URI库中使用umlauts

9

问题在于:Ruby的URI库无法处理umlauts(德语中的元音字母加上两个小圆点),即:

irb> require "uri"
irb* URI("http://abc.de/äöü")
URI::InvalidURIError: bad URI(is not URI?): http://abc.de/äöü

我该如何处理这个问题?顺便说一下,这是 Ruby 1.9.2 版本。


2
图书馆是正确的,在URI中使用这些字符是非法的。你应该对它们进行转义。 - Sergio Tulentsev
1
浏览器可以很好地处理URL中的umlauts;我该如何模仿浏览器的行为? - radiospiel
1
浏览器太宽容了,RFC则不一样。 - Sergio Tulentsev
2
@radiospiel浏览器通过将其静默转换为编码的URL来“处理”它,这也是它们实际发送的内容。 - Andrew Marshall
@tokland:这真的行得通吗?你可能是对的,但其他人在这里所说的——比如这根本不是一个URI——听起来也是对的。 - radiospiel
显示剩余6条评论
2个回答

15

在解析之前,请调用URI.encode

require 'uri'
uri = URI(URI.encode("http://abc.de/äöü"))
作为一个侧面说明,请注意如果URL包含一个哈希片段(#something),你将需要手动分割它:
require 'uri'
uri = URI(URI.encode('http://example.com/page.html') + '#' + URI.encode('anchor'))

太棒了!我完全不想使用Addressable,但这里有一个有效的URI解决方案。 - ujifgc

5

然后,你应该接受这个答案,这样其他人就可以知道,Sean也可以获得一些很棒的声望分数。 :) - vlasits
抱歉,我以为通过给答案点赞就可以自动接受它。现在这个问题已经解决了,希望下次我能记住 ;) - radiospiel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接