【问题标题】:Encoding::UndefinedConversionError "\xE7" from ASCII-8BIT to UTF-8编码::UndefinedConversionError "\xE7" 从 ASCII-8BIT 到 UTF-8
【发布时间】:2017-10-02 09:52:30
【问题描述】:

我正在开发一个 Rails API 项目。 这是我的代码 sn-ps

class PeopleController < ApplicationController
  respond_to :json

  def index
    respond_with Person.all
  end
end

当我访问网址localhost:3000/people.json

Encoding::UndefinedConversionError at /people.json
"\xE7" from ASCII-8BIT to UTF-8

自上周以来,我一直在尝试解决此问题,但仍在与此作斗争。 我在 stackoverflow 上发现了一堆类似的问题,例如 this 和 this 但没有一个解决方案对我有用。

这是我的配置。

Rails 4.2.7.1

ruby-2.3.1

操作系统:macOS Sierra

locale的输出

LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

内容在 ~/.bash_profile

export LC_CTYPE="utf-8"
export LC_CTYPE=en_US.UTF-8
export LANG=en_US.UTF-8
unset LC_ALL

输出 Encoding.default_external

 #<Encoding:UTF-8> 

【问题讨论】:

  • 你从哪里得到你的意见?在将其保存到数据库之前,我通常会替换无效字符(根据 UTF-8)。如果它已经在您的数据库中:您是否将其保存为 String 或 JSON?
  • 我正在从 MySQL 中获取它,让我检查一下我的数据库的编码,实际上,我是从旧应用程序导入数据库并尝试在 API 中使用它。

标签: ruby-on-rails ruby macos encoding utf-8


【解决方案1】:

我遇到过很多次这个问题,所以我通常会在将其保存到数据库之前尝试删除任何对 UTF-8 无效的字符。如果您将记录保存为String,您可以像这样替换无效字符:

string = "This contains an invalid character \xE7"
string.encode('UTF-8', invalid: :replace, undef: :replace)
#=> "This contains an invalid character �"

这是在将其转换为 JSON 对象之前的。

【讨论】:

  • 有没有办法从现有数据库中删除所有这些字符?因为我已经从另一个旧数据库中导入了内容,并且我不想每次都进行编码。
  • 您可以编写一个数据迁移来遍历您的数据并在每个条目上执行此操作。
  • 我发现了问题。问题是我在 people 表中有 uuid 字段,它是二进制类型并且有一些错误的值。谢谢你 。你拯救了我的一天!
  • 很高兴我能帮上忙 :)
猜你喜欢
  • 2014-08-26
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
相关资源
最近更新 更多