Кодировка файла, генерирующая пустой символ в 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
в шестнадцатеричном)