1

希望有人会帮助我:)

所以我在使用 utf8 字符时遇到了 utf8 编码问题,例如,来自 db..

我收到了这个错误:

incompatible character encodings: ASCII-8BIT and UTF-8

顺便说一句,从 db 编码不是问题。无论如何,我找到了解决我的问题的方法,那就是改变方法

Ruby193\lib\ruby\gems\1.9.1\gems\activesupport-3.2.6\lib\active_support\core_ext\string\output_safety.rb

我改变的方法是“concat”。所以我改变了这个方法:

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

对此:

def concat(value)
  value = (value).force_encoding('UTF-8')
  if !html_safe? || value.html_safe?
    super(value)
  else
    super(ERB::Util.h(value))
  end
end
alias << concat

但是当然这是一个坏主意,因为该应用程序无法在其他服务器上运行..

所以我想从我的初始化程序中覆盖这个方法,所以我创建了:

config/initializers/utf8_fix.rb

使用此代码:

module ActiveSupport #:nodoc:
  class SafeBuffer < String
    def self.concat(value)
      value = (value).force_encoding('UTF-8')
      puts "--------------------------------"
      puts "Loaded concat in utf8fix.rb"
      puts "--------------------------------"
      if !html_safe? || value.html_safe?
        super(value)
      else
        super(ERB::Util.h(value))
      end
    end
    alias << concat
  end
end

但似乎它不会覆盖默认方法。那么有人可以告诉我,我做错了什么吗?

4

2 回答 2

1

由于“concat”不是类方法,因此我不需要 self 在它之前,所以这是我的问题..

解决变化:

def self.concat(value)

至:

def concat(value)
于 2012-08-11T07:58:32.073 回答
0

对上述答案的一些修复:

module ActiveSupport #:nodoc:
    class SafeBuffer < String
        def concat(value)
          if value.is_a?String
            value = value.dup if value.frozen?
            value = (value).force_encoding('UTF-8')
            puts "--------------------------------"
            puts "Loaded concat in utf8fix.rb"
            puts "--------------------------------"
          end
          if !html_safe? || value.html_safe?
            super(value)
          else
            super(ERB::Util.h(value))
          end
      end
      alias << concat
    end
  end
于 2019-06-13T09:45:35.750 回答