2011-03-07 5 views
15

Ruby 1.9.2, Rails 3.0.4/3.0.5 및 Phusion Passenger 3.0.3/3.0.4를 사용하고 있습니다. 내 템플릿은 HAML로 작성되었으며 MySQL2 보석을 사용하고 있습니다. 다음 코드를 가지고 내 HAML 템플릿의 첫 번째 줄에ActionView :: Template :: Error (호환되지 않는 문자 인코딩 : UTF-8 및 ASCII-8BIT)

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

오류 점 : 나는 움라우트 같은 특수 문자가있는 매개 변수를 통과 할 때, 나에게 다음과 같은 오류를 제공하는 컨트롤러 액션을 그것에 :

<!DOCTYPE html> 

나의 이해는 내가 ASCII-8 비트 문자열와 연결되고있는 UTF-8 문자열을 가지고 있기 때문에이가 발생한다는 것입니다,하지만 난 내 인생이 무엇인지 알아낼 수 없기 때문 ASCII-8BIT 문자열입니다. 액션의 params가 UTF-8을 사용하여 인코딩되었고 인코딩을 추가했는지 확인했습니다. UML-8 선언을 HAML 템플릿과 루비 파일의 맨 위에 추가했는데 여전히이 오류가 발생합니다. 내 application.rb 파일뿐만 아니라 그것의 config.encoding = "UTF-8" 선언을 가지고 있으며, UTF-8의 모든 결과 다음 여기에

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

는 키커 : 나는 독립 승객 또는 잡종을 사용하여 내 맥 OSX에서 로컬로이 결과를 재현 할 수 없습니다 개발 또는 생산 중. 나는 리눅스에서 nginx + passenger를 실행하는 프로덕션 서버에서만 재현 할 수 있습니다. 프로덕션 서버의 콘솔에서 후자의 명령이 모두 UTF-8로 표시된다는 것을 확인했습니다.

이 같은 오류가 발생 했습니까? 어떻게 해결 했습니까?

답변

12

일부 디버깅을 한 후 내 App이 UTF-8로 코딩되었는지 여부에 관계없이 ASCII-8BIT로 모두 코딩 된 문자열이있는 ActionDispatch :: Request 개체를 사용할 때 문제가 발생한다는 것을 알았습니다. 이것이 리눅스에서 프로덕션 서버를 사용할 때만 발생하는 이유는 모르지만 로컬에서이 오류를 재현 할 수 없었기 때문에 루비 또는 레일스의 일부 변종이라고 가정합니다. 오류로 인해 이와 같은 광고의 구체적 발생 인스턴스 변수가 HAML 템플릿에 인쇄했을 때 문자열이 UTF-8 대신 ASCII-8BIT으로 인코딩 되었기 때문에

@current_path = request.env['PATH_INFO'] 

는 오류가 발생. @current_path을 강제

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

적절한 UTF-8 인코딩으로 강제 된 중복 문자열을 사용 :이 문제를 해결하기 위해 나는 다음과 같은했다. 이 오류는 request.headers과 같은 다른 요청 관련 데이터에서도 발생할 수 있습니다.

+0

같은 오류가있어서, 왜 Nginx/passenger 프로덕션에서 이런 일이 일어나는지 궁금합니다. LC_All이 올바르게 설정되었습니다.그러나 .env는 ASCII입니다. 로컬 서버에서 utf-8k –

+0

가 승객 https://github.com/phusion/passenger/issues/1328에 문제를 추가했습니다. –

9

MySQL은 골치 아픈 ascii의 근원 일 수 있었다. 적어도 이러한 가능성을 제거하기 위해 초기화에 다음을 넣어보십시오 :이 보석을 mysql2에 적용되지 않을 수 있습니다

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 



편집. 그러나 mysql에서 작동합니다.

+0

나는이 솔루션을 알고 있지만, mysql 젬이 아니라 mysql2 젬을 목표로하고있다. MySQL2에는이 문제가 없습니다. 또한, 데이터베이스에 쿼리하는지 여부에 관계없이 동일한 결과를 얻습니다. –

+0

같은 문제가 발생했습니다. 덕분에 문제가 해결되었습니다. – Xaqq

관련 문제