在ruby1.9中有没有办法从字符串中移除无效的字节序列?

oyt4ldly  于 2023-03-08  发布在  Ruby
关注(0)|答案(4)|浏览(118)

假设你有一个像"€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 => '')

其产生
"foo"
但这也会丢失有效的多字节字符€

p3rjfoxz

p3rjfoxz1#

"€foo\xA0".chars.select(&:valid_encoding?).join
kq0g1dla

kq0g1dla2#

"€foo\xA0".encode('UTF-16le', invalid: :replace, replace: '').encode('UTF-8')
von4xj4u

von4xj4u3#

Ruby 2.0和1.9.3

"€foo\xA0".encode(Encoding::UTF_8, Encoding::UTF_8, :invalid => :replace)

Ruby 2.1以上版本

"€foo\xA0".scrub

默认情况下,这些参数会将\xA0替换为符号,您可以指定不同的替换参数。

kpbwa7wx

kpbwa7wx4#

data = '' if not (data.force_encoding("UTF-8").valid_encoding?)

相关问题