[ruby-list:49470] Re: UTF-8 CSVファイルのBOMの処理について
From:
"5.5" <5.5@...>
Date:
2013-06-19 13:14:21 UTC
List:
ruby-list #49470
5.5 です。横からすみません。私も困ってたので勉強になりました。
Ruby 1.8 だと CSV.open とか CSV.read は BOM を自動的に取って
くれていたので,Ruby 1.9 への移行時にハマるんですよね。
(13/06/19 18:24), Uchio KONDO wrote:
> BOMがある場合、以下のようなモードの指定の仕方ができると思います。
>
> File.read("path/to/DATA.csv", mode: 'rb:BOM|UTF-8')
おおー,こんな書き方知りませんでした。
CSV もこれでうまくいきますね。上田さんが書かれた問題と同種の
問題を再現し,また近藤さんがお書きになった解決法でそれが解消
するサンプルコードをこのメール末尾に示します。
やっていることは,
[1] 1 行 1 列で,フィールド値が空の BOM 付き CSV ファイルを
作成(空文字列を "" で囲んでいる)
[2] そいつを読み込んでバイト列を確認
[3] "BOM|UTF-8" で CSV 読み込みして OK なことを確認
[4] "UTF-8" で CSV 読み込みしようとして例外が発生することを
確認(例外が出るのは,BOM + "" が一つのフィールド値として
解釈できないから)
です。
# encoding: utf-8
require "csv"
filename="bomb.csv"
# [1]
open(filename, "w:UTF-8"){|f| f.print %<\u{feff}"">}
# [2]
p IO.read(filename, encoding:
"ASCII-8BIT").unpack("H*").first.scan(/../).join(" ")
# => "ef bb bf 22 41 22"
# [3]
p CSV.read(filename, encoding: "BOM|UTF-8")
# => [[""]]
# [4]
p CSV.read(filename, encoding: "UTF-8")
# => Illegal quoting in line 1. (CSV::MalformedCSVError)
--
5.5@moji.gr.jp