我明白了很多,并没有想出优雅的解决方案。如果用户输入包含无效的字节序列,则需要能够使其不会引发异常。例如:

# @raw_response comes from user and contains invalid UTF-8
# for example: @raw_response = "\xBF"  
regex.match(@raw_response)
ArgumentError: invalid byte sequence in UTF-8
.

已提出许多类似的问题,结果似乎是编码或强制编码字符串。然而,这两个工作都没有:

regex.match(@raw_response.force_encoding("UTF-8"))
ArgumentError: invalid byte sequence in UTF-8
.

regex.match(@raw_response.encode("UTF-8", :invalid=>:replace, :replace=>"?"))
ArgumentError: invalid byte sequence in UTF-8
.

是ruby 2.0.0的错误,或者我错过了什么?

是什么是奇怪的是它看起来正确编码,但匹配继续提高例外:

@raw_response.encode("UTF-8", :invalid=>:replace, :replace=>"?").encoding
 => #<Encoding:UTF-8>
.

有帮助吗?

解决方案

在Ruby 2.0中 encode方法是一个no-op将字符串编码到其当前编码时:

请注意,从编码生成的转换为相同的编码生成enc是一个no-op,即,接收器在没有任何更改的情况下返回,即使存在无效字节,也没有提出异常。

这在2.1中发生了变化,其中还添加了 enc方法作为一种更简单的方法来做这件事。

如果您无法升级到2.1,则必须将其编码为不同的编码和背部,以便删除无效字节,如:

if ! s.valid_encoding?
  s = s.encode("UTF-16be", :invalid=>:replace, :replace=>"?").encode('UTF-8')
end
.

其他提示

自从您使用Rails而不仅仅是Ruby,您也可以使用 tidy_bytes。这与Ruby 2.0一起使用,也可能会给您回复明智的数据而不是只替换字符。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top