2011-12-22 16 views
4

Ruby 1.9.2p290でテキストファイルのエンコーディングを変更する際に問題があります。エラーが発生しましたUTF-8(ArgumentError)で無効なバイトシーケンスです。問題は(私は思うのですが)文字セットが未知であるという事実にあります。私がしなければ、その代わりに、文字エンコーディングを変更する

Non-ISO extended-ASCII English text, with CRLF line terminators 

または::

$ file -i test.txt 

は、私が手に:私がしなければ、次のコマンドラインから

$ file test.txt 

は私が取得

test.txt: text/plain; charset=unknown 

私がしなければしかし、Rubyで:

data = File.open("test.txt").read 

puts data.encoding.name 

puts data.valid_encoding? 

私が取得:ルビー1.9で

data = File.open("test.txt").read 

data.encode!("UTF-8") 

data.each_line do |line| 

    newfile_data << line 

end 
+0

いファイルにはすばらしい文字が含まれていますか?あなたはどのようにファイルを作成しましたか/それは何が保存されたのですか? – deceze

答えて

2
data = IO.read("test.txt", :encoding => 'windows-1252') 
data = data.encode("UTF-8").gsub("\r\n", "\n") 
8

ごと:

UTF-8 
false 

は、ここに私のコードの簡略化スニペットですストリームには2つのエンコーディング、つまり外部エンコーディングと内部エンコーディングがあります。 外部エンコーディングは、ストリームから読み込んだテキストのエンコーディングです(この場合、これはファイルのエンコーディングです)。内部エンコーディングは、ファイルから読み取られるテキストの望ましいエンコーディングです。

ストリームの外部/内部エンコーディングを設定しないと、プロセスのデフォルトの外部/内部エンコーディングが使用されます。内部エンコーディングが指定されていない場合は、ストリームから読み込まれた文字列は、外部エンコーディング(String.force_encodingと同じで(変換されない)タグ付けされている。

あなたが持っているほとんどの

Encoding::default_external # => Encoding:UTF-8 
Encoding::default_internal # => nil 

そして、あなたのファイルはASCIIでエンコードされましたベースませUTF-8で標準の文字エンコーディングは、。 あなたのRubyコードはUTF-8文字列に外部ソースからのバイトのシーケンスを読み込む。そして、あなたの文字列はあなたが得るNon-ISO extended-ASCII English textdata.valid_encoding? # => false

含まれているため、あなたは、外部エンコーディングを設定する必要がありますあなたのストリームをth eファイルのエンコーディング。

data = File.open("test.txt", 'r:windows-1251').read  
puts data.encoding.name # => windows-1251 
puts data.valid_encoding? # => true 

、あるいは内部と外部の両方のエンコーディングを指定:テキストфайлCP 1251エンコーディングのファイルを持っている場合たとえば、あなたは、次のコードでそれを読む必要が

data = File.open("test.txt", 'r:windows-1251:utf-8').read  
puts data.encoding.name # => utf-8 
puts data.valid_encoding? # => true 
関連する問題