Ruby:如何将文件保存为UTF-16 Little Endian

时间:2011-01-30 01:37:39

标签: ruby unicode utf-8 utf-16 utf-16le

我想将®保存到UTF-16 Little Endian的txt文件中,我在某些方面进行了测试

1.以下编码为UTF-8

$RegisterMark=[174].pack('U*')
file = File.new("C:/Output.txt","w")
file.puts $RegisterMark
file.close

2.下面的编码是UTF-16 Big Endian

require 'iconv'

$RegisterMark=[174].pack('U*')
$utf16RegisterMark =Iconv.conv('UTF-16', 'UTF-8', $RegisterMark )
file = File.new("C:/Output.txt","w")
file.puts $utf16RegisterMark 
file.close

指南Iconv.conv不支持UTF-16 LE类型。

如何使用UTF16 LE保存output.txt?

2 个答案:

答案 0 :(得分:7)

最简单的方法是首先将文件打开为UTF-16LE:

register_mark = "\00ua3" # or even just: register_mark = ®

File.open('C:/Output.txt', 'wt', encoding: 'UTF-16LE') do |f|
  f.puts register_mark
end

这里重要的一点是使用:encoding方法的options Hash中的File.new键明确指定文件的编码(或者在这种情况下) ,File.open)。这样,写入文件的字符串将自动转换,无论它们处于何种编码状态。

我还冒昧地将您的代码更改为更惯用的Ruby风格:

  • Ruby社区使用snake_case,而不是CamelCase用于变量和方法名称。
  • 应该避免全局变量,特别是因为在你的例子中,它们完全是多余的。
  • 这里真的没有必要使用Array#pack,只需记下你想要的内容。
  • 尽可能使用File.open的块形式,即使出现错误或异常,也会为您关闭文件。
  • 处理文本文件时,应始终传递t修饰符。它在大多数操作系统上没有任何区别(不幸的是,大多数Rubyist忘记传递它的原因),但它在Windows上是至关重要的,这就是你似乎正在使用的。< / LI>

答案 1 :(得分:2)

有些hacky,但这对我有用。具体来说,我试图让ruby输出带BOM的UTF-16LE

## Adds BOM, albeit in a somewhat hacky way.
new_html_file = File.open(foo.txt, "w:UTF-8")
new_html_file << "\xFF\xFE".force_encoding('utf-16le') + some_text.force_encoding('utf-8').encode('utf-16le')