2011-09-14 16 views
1

私はRails 3.0.9アプリケーションを私のdev envでローカルに実行し、herokuアプリケーションでリモートで実行しています。私にはa method that imports a CSV file into a modelがあります。このファイルには、°、á、é、íなどの英語以外の文字を含めることができます(スペイン語です)。Rails 3、Heroku:Tapsサーバーエラー:PGError:エラー:エンコード "UTF8"のバイトシーケンスが正しくありません:0xba

私は現時点でローカルdev(SQLite)データベースに問題なく完全なファイル(75kレコード)をインポートできます。 heroku db:pushでHerokuのにデシベルをアップロードするときには、それは私がタイトルに投稿してるのエラーで失敗します。

!!! Caught Server Exception 

HTTP CODE: 500 
Taps Server Error: PGError: ERROR: invalid byte sequence for encoding "UTF8": 0xba 
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". 

はどうやら、Herokuのは「°」の文字を挿入する問題があります。 (現時点ではファイルは、í、é、などの文字を任意のáはありませんが、私はこれらがあまりにも失敗する可能性があります疑いがある。)

は私が私のapplication.rbファイルのデフォルトのエンコーディングに設定されている、次のように:

#.../application.rb 
config.encoding = "utf-8" 

「クライアントのエンコード」を設定してこの問題を解決するには他に何ができますか?

答えて

4

numero sign,ºは、ISO-8869-1では0xBAで、UTF-8ではありません。したがって、あなたのCSVファイルはLatin-1でエンコードされていますが、エンコードを修正せずにUTF-8としてデータベースに保存しようとしています。

あなたのCSVライブラリにLatin-1でエンコードされたテキストを扱っていることを伝えてみると、UTF-8に変換することができます。それが動作しない場合は、Iconvでそれを自分で行うことができます。

ruby-1.9.2 > Iconv.iconv('UTF-8', 'ISO-8859-1', "\xba") 
=> ["º"] 
ruby-1.9.2 > Iconv.iconv('UTF-8', 'ISO-8859-1', "\xb0") 
=> ["°"] 

SQLiteのは非常に寛容傾向があり、それは非常に緩い型システムを持っているので、あなたはSQLiteのとのトラブルを持っていません。 OTOHのPostgreSQLは、不正なデータをフィードしようとすると、かなり厳しい傾向があり、適切に文句を言います。もしあなたがHerokuとPostgreSQLにデプロイするつもりなら、SQLiteの上での開発を止めることをお勧めします。問題を引き起こす他の違いがあります(例えばGROUP BYとLIKEの振る舞い)。

+0

詳細な説明ありがとうございます。私はPostreSQLの上で直接開発するというあなたの提案に従うつもりです。なぜなら、これは私がこの性質の問題に遭遇した初めてのことではないからです。 あなたが示唆しているIconvの使用法はあまり明確ではありません。インポートメソッドにどのように適用しますか?それとも、IconvでCSVファイルを何とか消さなければならないのですか? (あなたがUTF-8で直接テキストを取得できないと仮定して) – bruno077

+0

@ bruno077:エンコードを修正するためにSQLiteデータベース全体を回転させることができます( 'fixed = Iconv.iconv(....、sqlite_string);' 'fixed'をデータベースに戻します)、エンコーディングがローカルにソートされたら、SQLiteからアップロードします。最終的にはすべてがUTF-8になり、それまでは苦しんでいます(しかし、状況は10年前と比べるとはるかに優れています)。 –

+0

ご協力いただきありがとうございます。私はあなたの答えをマークします! – bruno077

関連する問題