2011-12-07 6 views
3

私はCSVファイルをRuby(1.8.7)にインポートしています。 。File.open( 'パス/ TO/file.csvになり')コンソールでこれをリターンを読み取る:ルビーと符号化変換

Stefan,Engstr\232m 

エンコーディングはUniversalDetector(chardetのGEM)によってISO-8859-2として識別されます。文字列を変換しようとする

UniversalDetector::chardet("Stefan,Engstr\232m") 
=> {"confidence"=>0.626936305574385, "encoding"=>"ISO-8859-2"} 

次が得られます。

Iconv.conv("UTF-8", "ISO-8859-2", "Stefan,Engstr\232m") 
=> "Stefan,Engstrm" 

私が期待するのに対し:

=> "Stefan,Engström" 
  • は、文字列が実際にいくつかの他のエンコーディングになっていませんか?
  • 私は以前に\ 232の構文を見たことがありません。通常、文字列が妙にエンコードされていると、奇妙な文字が代わりに表示されます。 またはいくつかの中国語。

さらに詳しい情報を提供したり、何かを詳しく説明してください。

+0

それは 'ISO-8859-2'だように見えていません。 '\ 246' http://en.wikipedia.org/wiki/ISO_8859-2 –

+2

@Kassym:ISO 8859-2では' \ 366'、 '" \ nnn "'表記は8進数を使用します。 –

答えて

5

エンコーディングはおそらく"Macintosh Roman"であり、その他のオプションは"Mac Central European""Mac Icelandic"です。 \nnn表記では8進数を使用しているため、\232は小数点以下は154、文字154はこれら3つのエンコーディングすべてで期待される小文字のO-ウムラウト( "ö")です。 WindowsのコードページまたはISO 8859文字セットのいずれにも154が表示されません。私はMac Romanがアイスランド語や中央ヨーロッパのエンコーディングよりも一般的だと思います。

は、Iconvにして、あなたのソースのエンコーディングに'MacRoman'を使用してみてください:

>> Iconv.conv("UTF-8", "MacRoman", "Stefan,Engstr\232m") 
=> "Stefan,Engström" 
+0

非常に良いキャッチ! –

+0

感謝!私は大きなデータセットを試してみましたが、うまくいきました。 'UniversalDetector :: chardet'が正しく処理できなかったので、charsetをどのように検出するのか把握するだけです。あなたはこの分野を非常によく知っているようです - どんな考えですか? – sandstrom

+1

もう少し読んだら、Macromanを区別するのは難しいようです。 http://stackoverflow.com/questions/4198804/how-to-reliably-guess-the-encoding-between-macroman-cp1252-latin1-utf-8-and – sandstrom