0

我的 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
4

0 回答 0