
こんばんは
Ruby1.9.2のrails3.1.1を使用しています。
csvファイルをアップロードして、
data = param[:file].read.encode("UTF-8","UTF-8", :invalid => :replace, :undef => :replace, :replace => '').read.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => '?')
のように読み込みまして、最初の1行の最初の要素が"code"でした。そこで、
data[0][0] == "code"
としましたところ、falseが出力されました。両方とも文字コードはUTF-8で"code"なのですが、調査したところ
data[0][0]length #=> 5
"code".length #=> 4
という違いが見つかりました。
この読み込みデータの見えない文字はなんなんでしょうか。
また、これを取り除く方法は何かありませんでしょうか。よろしくお願いします。
参考
data = param[:file].read.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => '').read.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => '?')
としたところ、"???code"、長さ7という結果になりました。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
rails全然わからないので、以下は勘回答です。
使えなさそうだったら無視して下さい。
メソッドチェーン眺める限り、
param[:file]
とやらでFileのインスタンスとってる気がします。
(なぜそのあとread.encodeを2回続けているのかとかわかりませんが・・・)
その後readしてしまってますが、こうすると綺麗にBOM削るのは難しそうなので、IO/File時点で削るというのが第一感です。
日本語マニュアルにはまだ反映されていないっぽいんですが、下記のドキュメントにこの記法があります。
http://www.ruby-doc.org/core-1.9.3/Kernel.html#m …
たぶん、次の検討を経て取り入れられたものです。
http://bugs.ruby-lang.org/issues/1951
結論を言うと、頭の方の
param[:file].read.encode("UTF-8","UTF-8", :invalid => :replace, :undef => :replace, :replace => '')
といったあたりを
param[:file].set_encoding("BOM|UTF-8","UTF-8", :invalid => :replace, :undef => :replace, :replace => '').read
こんな感じに書き換えて動きませんかね?という・・・
的外れだったらすみません。
この回答への補足
params[:file]の型には「set_encodeメソッド」はないようです。
また、params[:file]の型はActionDispatch::Http::UploadedFile のため、典型のopenメソッドが使えないようです。
とりあえず、
params[:f].read.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => '')
で消えてくれるようになりました。
エラー処理扱いで釈然としませんが、袋小路です。
詳細な情報提供ありがとうございました。
No.3
- 回答日時:
それはBOMだと思います
UTF-8のBOMは3バイトで 0xEF 0xBB 0xBF です
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pythonのエラーについて
-
【ExcelVBA】300万件越えCSVか...
-
Excelマクロ 空白セルを無視し...
-
VBAでcsvファイルもシートもあ...
-
ダブルコーテーション付きでCSV...
-
バッチ処理 特定の文字以降を...
-
teratermで、ファイル名をinput...
-
VBAで複数のCSVからレコードセ...
-
VBA テキストボックスを選択状...
-
型の値をDataGridViewセルに変換...
-
C言語のプログラム
-
ファイル名を変数で書きこむfwr...
-
LibreOffice Calcのマクロで、...
-
CSVデータの文字列置換
-
EXCEL→CSV保存時のダブルクォー...
-
EXCEL CSVにて保存するときのダ...
-
VB2010でのHTMLタグ抽出
-
IPアドレスのゼロパディング
-
バッチファイルでCSVの中身を仕...
-
Access VBA エラー2448について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングについて教えて...
-
pythonのエラーについて
-
fortranでNAのあるデータを読み...
-
【fortran77】空行を含む数値デ...
-
rubyの見えない文字
-
【ruby】flockで掛けたロックを...
-
pycharmへのpysamインストール...
-
Rubyで、外で定義した文字列をd...
-
Fortran:列数の分からないデー...
-
Excelマクロ 空白セルを無視し...
-
バッチ処理 特定の文字以降を...
-
VBAでcsvファイルもシートもあ...
-
ダブルコーテーション付きでCSV...
-
【ExcelVBA】300万件越えCSVか...
-
INPUTタグ disabledの文字色を...
-
ファイル名を変数で書きこむfwr...
-
VBAで複数のCSVからレコードセ...
-
VBA テキストボックスを選択状...
-
CSVで余計な空行が入る
-
Access VBA エラー2448について
おすすめ情報