私は、Minecraftのログファイルからユーザー名を削るためのツールを作ろうとしています。これらの中には、ゲームが色の書式設定に使用するものであり、ファイルの各行から次の文字を削除したいので、多くのセクションシンボルがあります。しかし、Rubyでファイルを読み込もうとすると、正しい文字を取得できません。これを理解しようとするために、セクション記号を含むファイルをさまざまな方法で検査しました。ファイルはa.log
,b.log
、およびc.log
です。セクションシンボル(§)が作成された場所によって正しく読み取られないのはなぜですか?
a.log
は、ファイルに§
をINGのecho
によって作成されたb.log
私自身のMinecraftのログファイルのいずれかをINGのcat
によって作成された、その後、Vimのc.log
に他のすべての文字を削除すると、メモ帳で作成された
メモ帳で見ると、すべて正しく表示されています。
私はVimの中でそれらすべてを見たときにそれは同じです:
その後、物事がスタート奇妙なwheを得るためにn Rubyでそれらを開きます。 は、ここで私が使用したコードです:
a = File.open("./a.log")
aa = a.read
puts aa.encoding
puts aa.ord
puts aa
b = File.open("./b.log")
bb = b.read
puts bb.encoding
puts bb.ord
puts bb
c = File.open("./c.log")
cc = c.read
puts cc.encoding
puts cc.ord
puts cc
そして、ここでは、出力されます。
IBM437
239
§
IBM437
167
▒
IBM437
167
▒
私は、各ファイルの内容を表示するためにcat
を使用するまで、私は、多分これはちょうどRubyは奇妙されていたことを考えました:
$ cat a.log b.log c.log
§
▒
▒
エンコードが同じであることが示されているため、これは意味をなさない。だから私は、六角ビューア(HXD)内の各ファイルを開くことを決めた:
何!?これらのすべてに同じ文字が含まれています。動作するものと動作しないものの唯一の違いは、のa.log
です!なぜこれで違いが出るのですか?Rubyのgsub
と動作するように修正するにはどうしたらいいですか?
(これは私がString.force_encoding
とString.encode
でオンラインで見つけたものの束を使って行いましたが、出力に度の記号が表示されることを除いてはどこでも得られませんでした。これは3種類のログファイルすべてに有効です)。
EDIT:もう少し遊んだところ、それはC2
バイトでした。 UTF-8は0xC2 0xA7
を使用し、UTF-16は0x00A7
を使用します。これを正しく変換するにはどうすればよいですか(また、NotepadとVimにセクション記号として表示するのに問題がないのはなぜですか?)
Rubyのどのバージョンを使用しますか(<2.0)? [Byte Order Mark](https://en.wikipedia.org/wiki/Byte_order_mark)に興味があるかもしれません。 – spickermann
@spickermann 'ruby 2.3.1p112(2016-04-26リビジョン54768)[i386-mingw32]' – Peril