在ruby 1.9中是否有一种方法可以从字符串中删除无效的字节序列?

Ste*_*anH 26 ruby encoding utf character-encoding ruby-1.9

假设你有一个像"€foo\xA0"UTF-8编码的字符串,有没有办法从这个字符串中删除无效的字节序列?(所以你得到"€foo")

在ruby-1.8中你可以使用,Iconv.iconv('UTF-8//IGNORE', 'UTF-8', "€foo\xA0")但现在已经弃用了."€foo\xA0".encode('UTF-8')什么都不做,因为它已经是UTF-8了.我试过了:

"€foo\xA0".force_encoding('BINARY').encode('UTF-8', :undef => :replace, :replace => '')
Run Code Online (Sandbox Code Playgroud)

产量

"foo"

但这也失去了有效的多字节字符€

Van*_*orn 34

"€foo\xA0".encode('UTF-16le', invalid: :replace, replace: '').encode('UTF-8')
Run Code Online (Sandbox Code Playgroud)

  • 我的印象是它的字符集比UTF-8大,这意味着你不会丢失任何有效的数据.不幸的是以下不起作用:`"€foo\xA0".encode('UTF-8',:invalid =>:replace,:replace =>'')`因为字符串已经是UTF-8,所以它将不会再次编码. (2认同)
  • UTF-8和UTF-16都可以表示所有Unicode字符.唯一的区别是字符的编码方式. (2认同)

Evg*_*nii 33

"€foo\xA0".chars.select(&:valid_encoding?).join
Run Code Online (Sandbox Code Playgroud)

  • @Dorian,在 1.9.3 IRB 控制台上,`"eEspa\xF1a;FB".chars.select{|i| i.valid_encoding?}.join` 返回 `"eEspaa;FB" ` ...您没有明白这种行为还是我误解了? (2认同)