2

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です。

4

1 に答える 1

1

いくつかの考え:

  1. アップロードするファイルのエンコードを確認しましたか?
  2. Frederick Cheungが提案したように、Macで1.9.2-p180をテストしましたか?
  3. 各プラットフォームでCharDet.detectの結果を出力して、(アップロードされたファイルではなく)受信したファイルのエンコーディングを確認しましたか?LinuxのApacheとMacのWEBrickで設定が違うのではないでしょうか。
  4. 両方のプラットフォームで同じバージョンのCharDetを使用していますか?どのライブラリを使用していますか(iconvなど)、両方のプラットフォームで同じバージョンですか?

1.9.2と1.9.3のエンコーディングに関する動作の違いはわかりませんが、具体的に調査したこともありません。また、MRIビルドの構成の違いである可能性もあります。

于 2012-06-28T16:53:09.993 に答える