2016-10-14 6 views
2

私は、Minecraftのログファイルからユーザー名を削るためのツールを作ろうとしています。これらの中には、ゲームが色の書式設定に使用するものであり、ファイルの各行から次の文字を削除したいので、多くのセクションシンボルがあります。しかし、Rubyでファイルを読み込もうとすると、正しい文字を取得できません。これを理解しようとするために、セクション記号を含むファイルをさまざまな方法で検査しました。ファイルはa.log,b.log、およびc.logです。セクションシンボル(§)が作成された場所によって正しく読み取られないのはなぜですか?

  • a.logは、ファイルに§をINGのechoによって作成された
  • b.log私自身のMinecraftのログファイルのいずれかをINGのcatによって作成された、その後、Vimの
  • c.logに他のすべての文字を削除すると、メモ帳で作成された

メモ帳で見ると、すべて正しく表示されています。

a.log
a.log in notepad
b.log
b.log in notepad
c.log
c.log in notepad

私はVimの中でそれらすべてを見たときにそれは同じです:

logfiles in 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
a.log in hex viewer
b.log
b.log in hex viewer
c.log
c.log in hex viewer

何!?これらのすべてに同じ文字が含まれています。動作するものと動作しないものの唯一の違いは、のa.logです!なぜこれで違いが出るのですか?Rubyのgsubと動作するように修正するにはどうしたらいいですか?

(これは私がString.force_encodingString.encodeでオンラインで見つけたものの束を使って行いましたが、出力に度の記号が表示されることを除いてはどこでも得られませんでした。これは3種類のログファイルすべてに有効です)。

EDIT:もう少し遊んだところ、それはC2バイトでした。 UTF-8は0xC2 0xA7を使用し、UTF-16は0x00A7を使用します。これを正しく変換するにはどうすればよいですか(また、NotepadとVimにセクション記号として表示するのに問題がないのはなぜですか?)

+0

Rubyのどのバージョンを使用しますか(<2.0)? [Byte Order Mark](https://en.wikipedia.org/wiki/Byte_order_mark)に興味があるかもしれません。 – spickermann

+0

@spickermann 'ruby 2.3.1p112(2016-04-26リビジョン54768)[i386-mingw32]' – Peril

答えて

1

この問題は、特定のシステムでは、使用しているエンコードが必ずしもわからないことがあります。この場合、Rubyは入力がIBM437だと思っていますが、そのコードページを参照するとA7の文字はセクションsynbolではありません。多くの場合、通訳者はISO-8859-1IBM437、およびその他のエンコーディングを混在させます。 ISO-8859-1のセクションシンボルはA7です。実際は正しいエンコーディングです。メモ帳とVimが正しく表示できる理由は、catとRubyインタプリタよりもエンコーディングを推測する方が優れているからです。

ISO-8859-1に、次にencode!UTF-8に設定してください。

1

ルビソースファイルもUTF-8でエンコードされていることを確認してください。私はあなたがPHPを使って何度も記述した症状を見てきました。私のソースファイルはISOで、xmlやその他の種類のデータにUTF-8でアクセスしていました。

何らかの理由でUTF-8でルビファイルをエンコードできない場合や、UTF-8ソースを扱うことがわかっていることを確認するためにファイルオープン関数を調べる必要があります。

関連する問題