Кодировка файла, генерирующая пустой символ в ruby ​​- почему?

Я использую этот маленький рубин:

File.open(ARGV[0], "r").each_line do |line|
   puts "encoding: #{line.encoding}"
   line.chomp.split(//).each do |char|
     puts "[#{char}]"
  end
end

И у меня есть образец файла, который я загружаю в файл, который содержит три периода и новую строку.

Когда я сохраняю этот файл с кодировкой файла utf-8 (в vim: set fileencoding=utf-8) и запустить этот скрипт на нем я получаю этот вывод:

encoding: UTF-8
[]
[.]
[.]
[.]

И затем, если я изменю кодировку файла на latin1 (в vim: set fileencoding=latin1) и запустите скрипт, я не получу первый пустой символ:

encoding: UTF-8
[.]
[.]
[.]

Что тут происходит? Я понимаю, что кодировка utf8 помещает несколько байтов в начало файла, чтобы пометить файл как кодированный utf8, но я думал, что они должны были быть невидимыми при обработке текста (то есть: среда обработки ruby ​​должна была их обрабатывать). Что мне не хватает?

кстати:

ubuntu:~$ ruby --version
ruby 1.9.2p0 (2010-08-18 revision 29034) [i686-linux]

Спасибо!

Обновить:

Шестнадцатеричный дамп файла с дополнительным символом (спецификацией):

ubuntu:~$ hexdump new.board
0000000 bbef 2ebf 2e2e 0a0d 0a0d
000000a

1 ответ

Попробуйте запустить

data = IO.read(ARGV[0])
puts data.dump

и посмотрим, что вы получите. Это напечатает управляющие коды любых непечатаемых символов.

Это не похоже на метку порядка байтов UTF8, если я устанавливаю спецификацию с помощью :set bomb в VIM на файл и попробуйте ваш код, я получаю

[?]
[?]
[?]
[.]
[.]
[.]

в то время как dump дает мне

"\357\273\277...\n"

который будет восьмеричным представлением спецификации (EF BB BF в шестнадцатеричном)

Другие вопросы по тегам