新手问题 ruby uri invalid byte sequence in UTF-8 求解

sbaifa · 2014年10月08日 · 最后由 sbaifa 回复于 2014年10月08日 · 1699 次阅读
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>'

ruby 版本

 /usr/lib64/fluent/ruby/bin/ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]

我需要获取这种情况下的 host,遇到这个问题。网上搜了好久没找到合适的资料,哪位大大遇到过帮看看,在此感谢

因为 "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!

非常感谢,只替换部分呈问号,能够正常工作对获取 host 值无影响

需要 登录 后方可回复, 如果你还没有账号请 注册新账号