3

如何获取 Ruby 字符串的兼容编码列表?(MRI 1.9.3)

用例:我有一些用户提供的字符串,用 UTF-8 编码。理想情况下,我需要将它们转换为ISO/IEC 8859-1(8 位),但是当存在一些特殊字符时,我还需要回退到 unicode。

另外,有没有更好的方法来完成这个?也许我正在测试错误的东西。


编辑-为答案添加更多细节
坦克,我可能应该添加一些上下文。我知道如何进行编码转换。
我正在寻找一种方法来快速找出一个字符串是否可以安全地编码为另一种编码,或者,以另一种(而且完全错误的)方式,支持该字符串中所有字符 的最小编码是什么。

仅将字符串转换为 16 字节不是一种选择,因为它们将作为 SMS 发送并将它们转换为 16 字节编码会将可用字符的数量从 160 个减少到 70 个。

只有当它们包含不支持的特殊字符时,我才需要将它们转换为 16 字节ISO/IEC 8859-1

4

5 回答 5

4

不幸的是,Ruby 的编码兼容性理念与您的用例并不完全一致。但是,尝试在 ISO-8859-1 中编码您的 UTF-8 字符串并捕获无法转换时引发的错误将实现您所追求的:

begin
  'your UTF-8 string'.encode!('ISO-8859-1')
rescue Encoding::UndefinedConversionError
end

如果可能,会将您的字符串转换为 ISO-8859-1,否则将其保留为 UTF-8。

注意这个使用encode,它实际上使用转码字符串Encoding::Converter(即重新分配正确的编码字节模式给字符串的字符表示),不像force_encoding,它只是改变编码标志(即告诉Ruby根据设置的编码解释字符串的字节流)。

于 2013-01-15T22:29:57.117 回答
2

Ruby 有标准库,您可以在其中找到类Encoding和他的名为Encoding::Converter的子类,在这种情况下,它们可能是您最好的朋友。

#!/usr/bin/env ruby
# encoding: utf-8

converter = Encoding::Converter.new("UTF-8", "ISO-8859-1")
converted = converter.convert("é")

puts converted.encoding
# => ISO-8859-1

puts converted.dump
# => "\xE9"
于 2013-01-15T12:28:22.957 回答
2

valid_encoding?String 的实例方法)有用吗?那是:

try_str = str.force_encoding("ISO/IEC 8859-1")
str = try_str if try_str.valid_encoding?
于 2013-01-15T23:39:13.963 回答
-1

要转换为ISO-8859-1您可以按照以下代码对其进行编码。

1.9.3p194 :002 > puts "é".force_encoding("ISO-8859-1").encode("UTF-8")
é
 => nil 

链接答案

于 2013-01-15T12:20:34.747 回答
-1
"Some String".force_encoding("ISO/IEC 8859-1")

您也可以参考rails encoding 链接

于 2013-01-15T12:22:07.307 回答