我想将®保存到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?
答案 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风格:
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')