Ruby on Rails - 编码问题

时间:2016-05-14 04:32:27

标签: ruby-on-rails

在db(sqlite3)中插入数据时出现以下错误

  

编码:: UndefinedConversionError(" \ xF0"从ASCII-8BIT到UTF-8):

在database.yml文件中,我提供了编码为UTF-8

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

甚至将sqlite配置为接受UTF-8(PRAGMA编码返回UTF-8)。

仍在查询回滚 -

   (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):

1 个答案:

答案 0 :(得分: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(八进制001)和ASCII代码126(八进制176)之间的任何字符。这有效地擦除了任何非ASCII字符(和ASCII 0)的字符串。

如果您需要&#34;扩展ASCII&#34;要与国际字符集(如ISO-8859字符集或Windows 1252)或甚至特定的Unicode字符一起使用,您可以通过更改数字来扩展范围以包括这些字符以包含这些字符。