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

我想将®保存到带有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?

最简单的方法是首先将文件打开为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 

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

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

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

有点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')