irb(main):010:0> str = "sar\xE0".force_encoding "ASCII-8BIT"
irb(main):011:0> str.encode 'ISO-8859-1', "ASCII-8BIT"
Encoding::UndefinedConversionError: "\xE0" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to ISO-8859-1
from (irb):11:in `encode'
from (irb):11
from /Users/ben/.rbenv/versions/2.4.1/bin/irb:11:in `<main>'
我有一个字符串ASCII-8BIT
(二进制),我想将其转换为另一种编码,但是似乎每次转换都尝试将其转换为utf-8
,因此失败(基本上它迫使我替换未定义的字符)。
为什么会这样呢?我该如何避免呢?
给定一个二进制(ASCII-8BIT
)编码的字符串:
str = "sar\xE0".b #=> "sar\xE0"
str.encoding #=> #<Encoding:ASCII-8BIT>
您可以通过以下方式告诉Ruby该字符串实际上在ISO-8859-1中force_encoding
:
str.force_encoding('ISO-8859-1') #=> "sar\xE0"
str.encoding #=> #<Encoding:ISO-8859-1>
请注意,您仍会看到,\xE0
因为Ruby不会尝试转换字符。
在UTF-8终端上打印字符串将得到:
puts str
sar�
显示了替换字符 ,因为它0xE0
是UTF-8中的无效字节。
但是,在ISO-8859-1终端上打印相同的字符串会得到:
puts str
sarà
要在Ruby中使用字符串,通常需要通过以下方式将其转换为UTF-8 encode!
:
str.encode!('UTF-8') #=> "sarà"
str.encoding #=> #<Encoding:UTF-8>
或将目标编码和源编码都传递给以下步骤encode!
:
str = "sar\xE0".b #=> "sar\xE0"
str.encode!('UTF-8', 'ISO-8859-1') #=> "sarà"
str.encoding #=> #<Encoding:UTF-8>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句