2

私はこの小さなルビーを使用しています:

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

そして、ファイルにフィードしているサンプルファイルがあり、3 つのピリオドと改行だけが含まれています。

このファイルを utf-8 のファイル エンコーディング (vim: でset fileencoding=utf-8) で保存し、このスクリプトを実行すると、次の出力が得られます。

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

そして、fileencoding を 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]

ありがとう!

アップデート:

余分な文字 (BOM) を含むファイルの 16 進ダンプ:

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

1 に答える 1

1

実行してみてください

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

そして何が得られるか見てください。これにより、印刷されない文字のエスケープ コードが印刷されます。

ファイルにvimを使用してBOMを設定し、取得したコードを試してみると、UTF8バイトオーダーマークのようには見えません:set bomb

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

しながらdump私を与える

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

これは、BOM の 8 進数表現 ( EF BB BF16 進数) になります。

于 2010-10-01T06:29:58.090 に答える