在我的JRuby应用程序中,我从两个来源获得输入:
- 外部文件
- 一个Java程序,它调用我的JRuby代码并向我传递数据
一些外部数据被(假设)编码为ISO_8859_1,而我在内部将其处理为UTF_8,并生成UTF_8作为输出.
遗憾的是,有时会出现编码错误:数据偶尔包含无效的ISO_8859_1字节,这将无法修复.该规范要求简单地丢弃那些非法输入的字节.
对于文件,我使用以下命令读取该文件
string = File.new(filename, {external_encoding: Encoding::ISO_8859_1, internal_encoding: Encoding::UTF_8, converters: UTF8_CONVERTER})
converts子句负责跳过非法输入的字节.
对于从Java端接收的字符串,我当然可以将它们转换为UTF_8,方法是执行
string = iso_string.encode(Encoding::UTF_8)
但我怎么才能抓到这里的非法人物呢?根据我对Ruby Docs中encode
方法的理解,可以在目的地编码之后声明的选项没有提供converts键.
UPDATE个
下面是一个简单的例子来演示这个问题:
(1)好 case (无错误)
s = [49, 67].pack('C*')
put s
puts s.encoding
u = s.encode(Encoding::UTF_8)
puts u
puts u.encoding
这是打印的
1C
ASCII-8BIT
1C
UTF-8
(2)错误 case
x = [49, 138, 67].pack('C*')
x.encode(Encoding::UTF_8)
不出所料,加薪UndefinedConversionError: ""\x8A"" from ASCII-8BIT to UTF-8
我try 了什么(尽管没有记录):
t = x.encode(external_encoding: Encoding::ISO_8859_1, internal_encoding: Encoding::UTF_8, converters: UTF8_CONVERTER)
有趣的是,这消除了例外,但转换并未成功.如果我做一个
t.encoding
我还是能看到ASCII-8BIT.似乎什么都没有被转换.我希望删除非法字符,即在本例中t
是空字符串.