2011-03-07 48 views
15

我使用Ruby 1.9.2,Rails 3.0.4/3.0.5和Phusion Passenger 3.0.3/3.0.4。我的模板是用HAML編寫的,我使用的是MySQL2 gem。我有一個控制器動作,當通過具有特殊字符,如變音參數,使我有以下錯誤:ActionView :: Template :: Error(不兼容的字符編碼:UTF-8和ASCII-8BIT)

ActionView::Template::Error (incompatible character encodings: UTF-8 and ASCII-8BIT) 

錯誤指向我的HAML模板的第一線,它具有以下代碼它:

<!DOCTYPE html> 

我的理解是,這是因爲我有正接受ASCII-8BIT串級聯一個UTF-8字符串引起的,但我不能爲我的生活找不出什麼ASCII-8BIT字符串是。我已經檢查過動作中的參數是使用UTF-8編碼的,並且我已經在HAML模板和ruby文件的頂部添加了一個編碼:UTF-8聲明,並且仍然出現此錯誤。我的application.rb中的文件中有一個config.encoding = "UTF-8"聲明以及所有結果在UTF-8如下:

ENV['LANG'] 
__ENCODING__ 
Encoding.default_internal 
Encoding.default_external 

這裏的踢球者:我不能在本地在我的Mac-OSX使用獨立旅客或雜種重現這一結果在開發或生產中。我只能在Linux上運行nginx + passenger的生產服務器上重現它。我已經在生產服務器的控制檯中驗證了後者提到的所有命令都以UTF-8格式生成。

你有沒有經歷過同樣的錯誤,你是如何解決它的?

回答

12

在做了一些調試之後,我發現使用ActionDispatch :: Request對象的時候會發生這個問題,而這個對象碰巧有所有以ASCII-8BIT編碼的字符串,無論我的應用程序是用UTF-8編碼還是不用。我不知道爲什麼只在Linux上使用生產服務器時纔會發生這種情況,但我會認爲這是Ruby或Rails中的一些怪癖,因爲我無法在本地重現此錯誤。具體地發生,因爲像這樣的行的錯誤:

@current_path = request.env['PATH_INFO'] 

當該實例變量的HAML模板印刷,因爲在字符串在ASCII-8BIT編碼UTF-8而不是導致錯誤。爲了解決這個問題,我做了以下內容:

@current_path = request.env['PATH_INFO'].dup.force_encoding(Encoding::UTF_8) 

迫使@current_path使用已被迫進入正確的UTF-8編碼複製字符串。與其他請求相關的數據(如request.headers)也會發生此錯誤。

+0

有同樣的錯誤,我想知道爲什麼這是在生產Nginx /乘客發生。它正在正確設置LC_All。但請求.env是ASCII。在本地服務器上,它的utf-8k – 2014-12-18 18:12:49

+0

在乘客https://github.com/phusion/passenger/issues/1328上添加了一個問題 – 2014-12-19 11:30:05

9

Mysql可能是麻煩的ascii的來源。嘗試把以下的初始化至少消除了這種可能性:

require 'mysql' 

class Mysql::Result 
    def encode(value, encoding = "utf-8") 
    String === value ? value.force_encoding(encoding) : value 
    end 

    def each_utf8(&block) 
    each_orig do |row| 
     yield row.map {|col| encode(col) } 
    end 
    end 
    alias each_orig each 
    alias each each_utf8 

    def each_hash_utf8(&block) 
    each_hash_orig do |row| 
     row.each {|k, v| row[k] = encode(v) } 
     yield(row) 
    end 
    end 
    alias each_hash_orig each_hash 
    alias each_hash each_hash_utf8 
end 



編輯

這可能並不適用於mysql2寶石。適用於MySQL但是。

+0

我知道這個解決方案,但它的目標是MySQL的寶石不是mysql2寶石。 Mysql2沒有這個問題。另外,不管我是否查詢數據庫,我都會得到相同的結果。 – 2011-03-08 18:09:16

+0

我遇到了同樣的問題。這解決了這個問題,謝謝。 – Xaqq 2013-01-16 17:27:47

相關問題