0

Rails 3.2.13 애플리케이션을 Ruby 1.8.7-p370에서 Ruby 1.9.3-p385로 업그레이드하고 있습니다. 업그레이드 후 데이터베이스에서 검색 한 텍스트에 특수 문자가 왜곡됩니다. 예를 들어 "café"는 "café"로 나타납니다. 내 데이터베이스는 latin1로 인코딩되어 있습니다. 나는이 같은 mysql2 (0.3.11) 내 database.yml 외모를 사용하고 있습니다 : Ruby 1.8.7에서 1.9.3으로 Rails 3 앱을 업그레이드하면 database.yml의 latin1 인코딩 스펙이 적용되지 않습니다.

development: 
    adapter: mysql2 
    encoding: latin1 
    database: my_db 
    username: root 
    host: localhost 

이 (같은 문제는 동일한 데이터베이스의 설정을 가지고 생산 환경에서 일어나고있다.)

그것은 나타납니다 ActiveRecord가 데이터베이스에서 텍스트를 가져올 때, 지정된대로 latin1 (또는 ISO-8859-1)이 아닌 utf-8 인 것처럼 그것을 디코딩합니다.

문제를 진단하기 위해, 나는 그 액티브 우회 데이터베이스를 직접 조회 할 수 mysql2를 사용하는 루비 스크립트를 작성 : 아이디 12934와 제조법은 제목에서 단어 "카페"가

require 'rubygems' 
require 'mysql2' 

client = Mysql2::Client.new(:host => "localhost", 
          :username => "root", 
          :database => "food52_development_production", 
          :encoding => "latin1") 

result = client.query('SELECT title FROM recipes WHERE id = 12934') 

puts result.first["title"] 

. 1.9.3에서이 스크립트를 실행하면 올바르게 디코딩 된 텍스트 ("café")가 출력됩니다. :encoding 옵션을 "utf-8"으로 변경하면 다시 깨진 텍스트 ("café")가 표시됩니다.

또한 ActiveRecord::ConnectionAdapters에 중단 점을 배치하여 레일스가 Mysql2::Client을 초기화하는 인코딩 구성을 확인했습니다. 예상대로 :encoding => "latin1"이 전달됩니다.

아직 : 줄을 따라 가면, Rails는 텍스트를 utf-8로 디코드하기로 결정합니다. Rails가 내가 지정한 latin1 인코딩 설정을 존중하게하려면 어떻게해야합니까? 귀하의 도움에 미리 감사드립니다.

+0

시스템 사양은 무엇입니까? – tylerdavis

+0

@tylerdavis, 나는 OS X 10.8.2를 사용하고 있지만, 제작 과정에서 우분투와 동일한 문제가 발생합니다. – hoffm

답변

1

1.9.3부터 iconv는 더 이상 사용되지 않습니다. 또한 Rails 3은 모든 입력에 대해 UTF-8 인코딩을 기대합니다.

이렇게 말하면 몇 가지 옵션이 있습니다. 첫 번째는 상당히 해킹되지만 데이터를 이전하지 않으려는 경우 작동합니다.

iconv 라이브러리는 여전히 gem으로 제공되며, 앱에서 필요할 때마다 수동으로 이러한 변환을 수행 할 수 있어야합니다. 에어 비앤비에서

녀석 이상이 같은 도우미를 사용

def self.convert_string_encoding(to, from, str) 
    if "1.9".respond_to?(:force_encoding) 
    str = str.dup if str.frozen? 
    str.encode(to, from, :undef => :replace) 
    else 
    require 'iconv' 
    Iconv.conv(to, from, str) 
    end 
end 

는 변환을 처리 할 수 ​​있습니다. 당신은 잠재적으로 당신의 견해를 도우미에 던질 수 있습니다.

당신은 자신의 마이그레이션 인코딩 '데이터베이스에 다시 기본 UTF-8'레일로 변환 할 때 문제가 될 것입니다 here

에 대한 자세한 내용을보실 수 있습니다.

기존 데이터에서 UTF-8로 마이그레이션하는 것이 더 바람직 할 수 있습니다.

This article seems to cover that fairly well.

나는 희망이 도움이!

+0

그래서'some_string.encode ('ISO-8859-1', 'utf-8')'변환은 잘됩니다 : https : //gist.github.co.kr/hoffm/5207153 그러나이 정보를 사용하여 내 앱을 수정하는 방법을 모르겠습니다. – hoffm

+0

데이터베이스에 대해 온라인으로 시도 할 수있는 패치가 있거나 데이터베이스의 모든 필드를 UTF-8로 다시 인코딩하는 일회성 스크립트를 수행 할 수 있습니다. 문제 중 하나는 Rails가 UTF-8을 기본값으로 기대하므로 데이터를 다시 인코딩하는 스크립트가 최선의 방법이라고 생각합니다. [데이터베이스를 변환하는 방법에 대한 기사입니다.] (http://climbtothestars.org/archives/2004/07/18/converting-mysql-database-contents-to-utf-8/) 다른 [ 다른 기사] (http://yehudakatz.com/2010/05/17/encodings-unabridged/) 1.9와 Rails 3의 차이점. – tylerdavis

+0

감사합니다, Tyler. 결국 전환을 계획하고 있지만 1.9 마이그레이션과 동시에 수행하지 않기를 바랬습니다. – hoffm