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

jsj*_*wql 3 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

如何用UTF16 LE保存output.txt?

Jör*_*tag 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
Run Code Online (Sandbox Code Playgroud)

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

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

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