错误:不兼容的字符编码:UTF-8和ASCII-8BIT。

7

我遇到了一个错误:不兼容的字符编码:UTF-8和ASCII-8BIT,当视图在数据库中找到一些类似于ñ、á、é等的字符时。

我的环境是:

  • Rails版本:3.2.5
  • Ruby版本:1.9.4p194
  • 数据库:Oracle 10g(10.2.0.1.0)

我可以使用Toad将这些字符保存在数据库中。

我尝试在我的视图第一行写入以下内容:

<% # encoding: utf-8 %>

enviroment.erb 文件中:
Encoding.default_external = Encoding::UTF_8
Encoding.default_internal = Encoding::UTF_8

但是没有任何方法能够解决这个问题。

请问有人能够提供修复方法吗?

谢谢。


数据库和国家字符集是什么?select * from v$nls_parameter where parameter like '%CHARACTERSET' - Justin Cave
正如 https://dev59.com/UkrSa4cB1Zd3GeqPWXPR 所建议的,您应该了解和理解字符编码。建议的链接是一个很好的起点。 - Adam Hawkes
感谢 @JustinCave 的回答,我会去检查一下。 - Francisco Jacob
@AdamHawkes 谢谢您的评论,我会阅读链接以了解这个问题。 - Francisco Jacob
@JustinCave 这是 SQL 的结果:NLS_CHARACTERSER = WE8ISO8859P1 和 NLS_NCHAR_CHARACTERSET = AL16UTF16。 - Francisco Jacob
2个回答

6

我有同样的问题,在经过几个小时的搜索后,通过猴子补丁(一种特殊的程序)解决了这个问题。

    module ActiveSupport #:nodoc:
      class SafeBuffer < String

        def safe_concat(value)
          value = force_utf8_encoding(value)
          raise SafeConcatError unless html_safe?
          original_concat(value)
        end

        def concat(value)
          value = force_utf8_encoding(value)
          if !html_safe? || value.html_safe?
            super(value)
          else
            super(ERB::Util.h(value))
          end
        end

        alias << concat

        private

        def force_utf8_encoding(value)
          self.force_encoding('UTF-8').html_safe unless self.encoding.name == 'UTF-8'
          value = (value).force_encoding('UTF-8').html_safe unless value.nil? || value.encoding.name == 'UTF-8'
          value
        end
      end
    end

0
在文件boot.rb中,我添加了这行代码:
ENV['NLS_LANG'] = 'AMERICAN_AMERICA.UTF8'

通过这个,我解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接