如何在不通过ruby的UTF-8的情况下将编码从ASCII-8BIT转换为另一种编码?

桥本
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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将一种类型的CompletableFuture转换为另一种类型?

Java:以另一种编码方式将UTF8字符串转换为字节数组

如何将日期从一种格式转换为另一种golang

如何在不使用String日期的情况下将Java 8中的LocalDate从一种格式转换为另一种LocalDate格式?

如何强制Flow将值强制转换为另一种类型?

如何使用moment.js将日期转换为另一种格式?

如何将嵌套对象从一种类型转换为另一种类型

如何在不通过Powershell更改编码的情况下将命令的输出传递给文件?

如何将php对象数组从一种形式转换为另一种形式

如何将一种方法的输出的特定部分转换为另一种?

如何将CDATA格式从一种xml转换为另一种?

如何将变量从一种排序规则转换为另一种排序规则?

如何实现From将一种结果类型转换为另一种?

如何将时区偏移量转换为另一种格式

获取编码错误无法将ascii-8bit转换为utf-8bit

如何将PPA用户从一种PPA转换为另一种PPA?

如何将int值从一种方法转换为另一种方法

如何将一种类型的对象(接口)转换为另一种类型(接口)?

如何将一种格式的json转换为另一种格式

如何将音频文件从一种格式转换为另一种格式?

如何将日期时间字符串转换为另一种格式

如何使用Angular JS将一种日期格式转换为另一种格式?

如何将一种类型的对象数组转换为另一种类型?

如何将 XML 输入从一种格式转换为另一种格式

如何将日期从一种文化转换为另一种文化?

如何将字符串从一种编码转换为另一种编码

如何将矩阵中的对象转换为另一种类型?

如何优化将一种对象类型的列表转换为另一种类型的列表?

如何将数据从一种模式转换为另一种模式?