我的 Ruby 代码中有一个 UTF-8 字符串。由于限制,我想将该字符串中的 UTF-8 字符转换为它们的转义等效项(例如\u23
),或者只是将整个字符串转换为 UCS-2。我需要明确执行此操作以将数据导出到文件
我尝试在 IRB 中执行以下操作:
my_string = '7.0mΩ'
my_string.encoding
my_string.encode!(Encode::UCS_2BE)
my_string.encoding
它的输出是:
=> "7.0mΩ"
=> #<Encoding::UTF-8>
=> "7.0m\u2126"
=> #<Encoding::UTF-16BE>
这似乎工作正常(我得到“ohm”为 2126),直到我从数组中读取数据(在 Rails 中):
data.each_with_index do |entry, idx|
puts "#{idx} !! #{entry['title']} !! #{entry['value']} !! #{entry['value'].encode!(Encoding::UCS_2BE)}"
end
这导致错误:
不兼容的字符编码:UTF-8 和 UTF-16BE
然后我尝试编写一个基本的文件转换例程:
File.open(target, 'w', encoding: Encoding::UCS_2BE) do |file|
File.open(source, 'r', encoding: Encoding::UTF_8).each_line do |line|
output.puts(line)
end
end
这导致文件中出现各种奇怪的字符。
不知道出了什么问题。
有没有更好的方法来解决在 Ruby 中将 UTF-8 数据转换为 UCS-2 的问题?我真的不介意这实际上在字符串中被更改为字符串\u2126
的文字部分而不是实际值。
帮助!
临时解决方法
我猴子修补了这个来做我想做的事。它不是很优雅,但它可以完成工作(是的,我知道它不漂亮......这只是获得我需要的东西):
def hacky_encode
encoded = self
unless encoded.ascii_only?
encoded = scan(/./).map do |char|
char.ascii_only? ? char : char.unpack('U*').map { |i| '\\u' + i.to_s(16).rjust(4, '0') }
end.join
end
encoed
end
可以使用哪个:
"7.0mΩ".hacky_encode