кодировка файла, генерирующая пустой символ в ruby ​​- почему? - PullRequest
2 голосов
/ 01 октября 2010

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

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 Ответ

1 голос
/ 01 октября 2010

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

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

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

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

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

пока dump дает мне

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...