[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

In This Thread