2016-05-14 8 views
1

ながらDBにデータを挿入する(sqlite3の)私は、次の取得エラー(UTF-8にASCII-8BITから "\ XF0")ルビー - エンコーディングに関する問題

エンコーディング:: UndefinedConversionError:

database.ymlのファイルで

、私は(プラグマエンコーディングはUTF-8の場合)であってもSQLiteのはUTF-8を受け入れるように構成されているUTF-8

development: 
<<: *default 
database: db/development.sqlite3 
encoding: utf8 

として符号化を提供しています。

それでもクエリがロールバックされる -

(0.1ms) begin transaction 
    SQL (1.0ms) INSERT INTO "chat_data_regulars" ("username", "chat_timestamp", "name", "sent_text", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?) [["username", "a5fbf8bb6fea32fbbcc566c744592136"], ["chat_timestamp", "2016-05-14 04:12:16.942722"], ["name", "Tushar Saurabh"], ["sent_text", "You gave your mentee critical feedback"], ["created_at", "2016-05-14 04:12:33.308923"], ["updated_at", "2016-05-14 04:12:33.308923"]] 
    (12.6ms) commit transaction 
    (0.1ms) begin transaction 
    (0.2ms) rollback transaction 
    Completed 500 Internal Server Error in 16416ms (ActiveRecord: 14.5ms) 

    Encoding::UndefinedConversionError ("\xF0" from ASCII-8BIT to UTF-8): 
+0

モデルから新しいレコードを追加しようとしていますか?もしそうなら、モデルファイルの最上部に '#encoding:utf-8'を追加する必要があると思います。 –

+0

@jhonquintero、はい私はモデルを通して追加しています。 **#encoding:utf-8 **を追加しましたが、同じエラーが発生しています。 –

+0

HTMLページにはどのようなエンコードがありますか?彼らがUTF-8にいるのが最善でしょう。そうであれば、完全なスタックトレースを提供できますか?おそらく 'backtrace_silencers.rb'イニシャライザでバックトレースサイレンサを取り外した後でも?そして、あなたが使っているルビー+レールのバージョンは? – BoraMa

答えて

1

あなたは、データベースに格納する前にUTFへの変換を強制しようとするかもしれません。このコードは、無効または未定義文字を置き換える、元の文字列を変換します:

string.encode!("UTF-8", invalid: :replace, undef: :replace).force_encoding("utf-8") } 

は、より多くの情報のためString#encodeに、この情報を参照してください。

あなたのエンコーディングが一致した場合、あなたはまだこの問題を持っている、あなたは、単にこのGSUB呼び出しで文字列からそれらの非ASCII文字を削除することができます

x.map {|text| text.gsub!(/[^\001-\176]+/, "") } 

正規表現の間にある任意の文字を削除しますASCIIコード1(8進数001)およびASCIIコード126(8進数176)。これにより、非ASCII文字(およびASCII 0)の文字列が効果的にスクラブされます。

ISO-8859文字セットまたはWindows 1252などの国際文字セットで使用するための「拡張ASCII」が必要な場合、または特定のUnicode文字であっても、範囲を拡張して数字をそれらの文字を含む。

関連する問題