3

我想用 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

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

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

4

2 回答 2

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 HashFile.newFile.open

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

  • Ruby 社区使用snake_case, 不CamelCase用于变量和方法名称。
  • 应该避免使用全局变量,特别是因为在您的示例中,无论如何它们都是多余的。
  • 这里真的没必要用Array#pack,只要写下你想要的。
  • 尽可能使用 的块形式File.open,它会为您关闭文件,即使在出现错误或异常的情况下也是如此。
  • 处理文本文件时,应始终传递t修饰符。它在大多数操作系统上没有任何区别(这就是为什么不幸的是,大多数 Ruby 主义者忘记通过它的原因),但它在 Windows 上至关重要,这就是您似乎正在使用的。
于 2011-01-30T12:33:23.197 回答
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')
于 2014-04-09T00:51:35.950 回答