如何获取Ruby String的兼容编码列表? (MRI 1.9.3)
用例:我有一些用户提供的字符串,用UTF-8编码。理想情况下,我需要将它们转换为ISO/IEC 8859-1
(8位),但是当存在一些特殊字符时,我还需要回退到unicode。
此外,有没有更好的方法来实现这一目标?也许我正在测试错误的东西。
编辑 - 添加更多详情
坦克的答案,我应该添加一些背景。
我知道如何执行编码转换
我正在寻找一种方法来快速找出一个字符串是否可以安全地编码为另一种编码,或者将其置于另一种(并且非常错误)的方式,最小编码是什么来支持所有该字符串中的字符。
只是将字符串转换为16字节不是一种选择,因为它们将作为SMS发送并将它们转换为16字节编码,将可用字符数量从160减少到70.
只有当它们包含ISO/IEC 8859-1
不支持的特殊字符时,我才需要将它们转换为16字节。
答案 0 :(得分:3)
不幸的是,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
对字符串进行转码(即将正确的编码字节模式重新分配给字符串的字符表示),这与{{{ 1}},它只是更改编码标志(即告诉Ruby根据设置的编码解释字符串的字节流)。
答案 1 :(得分:2)
Ruby有standard library,你可以在其中找到类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"
答案 2 :(得分:2)
valid_encoding?
(instance method of String)有用吗?那就是:
try_str = str.force_encoding("ISO/IEC 8859-1")
str = try_str if try_str.valid_encoding?
答案 3 :(得分:-1)
要转换为ISO-8859-1
,您可以按照以下代码对其进行编码。
1.9.3p194 :002 > puts "é".force_encoding("ISO-8859-1").encode("UTF-8")
é
=> nil
答案 4 :(得分:-1)
"Some String".force_encoding("ISO/IEC 8859-1")
您也可以参考rails encoding link