3

®をUTF-16リトルエンディアンでtxtファイルに保存したいので、色々試してみました

1.以下のエンコーディングはUTF-8です

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

2.以下のエンコーディングはUTF-16ビッグエンディアンです

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 タイプをサポートしていません。

output.txt を UTF16 LE で保存するにはどうすればよいですか?

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修飾子を渡す必要があります。ほとんどのオペレーティング システムでは違いはありません (残念ながら、ほとんどの Rubyist がそれを渡すのを忘れているのはそのためです) が、Windows では非常に重要です。
于 2011-01-30T12:33:23.197 に答える
2

ややハックですが、これは私にとってはうまくいきました。具体的には、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 に答える