ruby uri invalid byte sequence in UTF-8 求解

2014-10-08 11:40:19 +08:00
 halfss
irb(main):010:0> URI("http://www.baidu.com/xEA\xE6").host
ArgumentError: invalid byte sequence in UTF-8
from /usr/lib64/fluent/ruby/lib/ruby/1.9.1/uri/common.rb:125:in `==='
from /usr/lib64/fluent/ruby/lib/ruby/1.9.1/uri/common.rb:125:in `split'
from /usr/lib64/fluent/ruby/lib/ruby/1.9.1/uri/common.rb:211:in `parse'
from /usr/lib64/fluent/ruby/lib/ruby/1.9.1/uri/common.rb:747:in `parse'
from /usr/lib64/fluent/ruby/lib/ruby/1.9.1/uri/common.rb:994:in `URI'
from (irb):10
from /usr/lib64/fluent/ruby/bin/irb:12:in `<main>'

我需要获取这种情况下的host,遇到这个问题。网上搜了好久没找到合适的资料,哪位大大遇到过帮看看,在此感谢
3420 次点击
所在节点    问与答
3 条回复
halfelf
2014-10-08 12:17:26 +08:00
那个URI是从哪儿来的,\xEA\xE6应该不是完整的unicode字符表示。我现在手头没有1.9,2.1里肯定是自动转的。1.9应该差别不大
halfss
2014-10-08 14:26:56 +08:00
因为 "http://www.baidu.com/xEA\xE6" 包含了非法的 utf-8 字符

str = "http://www.baidu.com/xEA\xE6"
str.valid_encoding? # => false
解决办法,先把 str 中得非法 utf-8 字符替换掉,比如替换成 ?

for i in (0...str.size)
unless str[i].valid_encoding?
str[i] = "?"
end
end
str.valid_encoding? # => true
enjoy!
halfss
2014-10-08 14:27:12 +08:00
暂时就这样解决了,有更好的方法欢迎留言

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/137548

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX