CSV ファイルのファイル アップロードを受け入れる Rails アプリケーションがあります。この機能を Mac でローカルに開発しているときに、アップロードされたファイルを (Ruby の標準ライブラリ CSV を使用して) 解析しようとすると、「UTF-8 のバイト シーケンスが無効です」というエラーが表示されました。
そのため、いくつかの調査を行い、StackOverflow で同様の質問に対するいくつかの回答を読んだ後、gem を使用して文字エンコーディング (つまり CharDet) を調べてみました。次に、CSV ライブラリを介してファイルを開くときに、エンコーディングを指定しました。これですべての問題が解決し、生活は良好になりました。
content = File.read(fullpath)
self.file_encoding = CharDet.detect(content)['encoding']
CSV.table(fullpath, :encoding => file_encoding, :header_converters => :downcase).headers
しかし、その後、このコードを実稼働 Linux 環境にデプロイしましたが、再び「UTF-8 の無効なバイト シーケンス」エラーが発生しました。なんという謎(とにかく私にとって)!エラーの解決にかなりの時間を費やした後、ファイルを開くときにエンコーディングを指定したコードを削除してみました。そして、奇跡的に本番環境での問題は修正されましたが、現在、ローカルの Mac 開発は壊れています。
どちらの場合も、同じブラウザを使用して同じファイルをアップロードしていることに注意してください。ここで何が起こっているのかについての洞察を持っている人はいますか?
ところで、Ruby のバージョンは近いですが、同じではありません。Mac はruby 1.9.3-p0で、Linux サーバーは1.9.2-p180です。アプリは Rails 3.2.6です。