Ruby: как сохранить файл в UTF-16 Little Endian - PullRequest
3 голосов
/ 30 января 2011

Я хочу сохранить ® в текстовый файл с помощью UTF-16 Little Endian, я тестировал его в некоторых отношениях

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.

Как я могу сохранить output.txt с UTF16 LE?

Ответы [ 2 ]

7 голосов
/ 30 января 2011

Самый простой способ - просто открыть файл как 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:

  • Сообщество Ruby использует snake_case, а не CamelCase для имен переменных и методов.
  • Глобальных переменных следует избегать, тем более что в вашем примере они в любом случае совершенно лишние.
  • Здесь действительно нет необходимости использовать Array#pack, просто запишите, что вы хотите.
  • По возможности используйте блочную форму File.open, которая позаботится о том, чтобы закрыть файл для вас, даже в случае ошибки или исключения.
  • При работе с текстовыми файлами вы всегда должны передавать модификатор t. Это не имеет никакого значения в большинстве операционных систем (именно поэтому, к сожалению, большинство Rubyists забывают об этом пропустить), но это крайне важно в Windows, что вы и используете. *
2 голосов
/ 09 апреля 2014

Отчасти хаки, но у меня это сработало.В частности, я пытался получить ruby ​​для вывода UTF-16LE с BOM

## 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')
...