2012-10-21 2 views
24

해시를 JSON 문자열로 변환 할 때마다 계속 Encoding::UndefinedConversionError - "\xC2" from ASCII-8BIT to UTF-8이 계속 발생합니다.Encoding :: UndefinedConversionError

begin 
    menu.to_json 
rescue Encoding::UndefinedConversionError 
    puts $!.error_char.dump 
    p $!.error_char.encoding 
end 
메뉴는 MySQL의 DB 콘텐츠와 속편의 dataset.to_hash입니다

, utf8_general_ci :이 같은 오류를 잡은 나는 매개 변수를 전환, 뒤로, .force_encoding.encode 체인, [.encode | .force_encoding](["UTF-8" | "ASCII-8BIT" ])으로 시도했지만 아무 것도 그래서 일 것 같았다

"\ XC2"

< #Encoding : ASCII-8BIT>

인코딩이 반환

.encode/.force_encoding 내가 사용하는 인코딩과 관계없이 인코딩이 변경되지 않습니다. 심지어 행운을하지 않고 .gsub!(/\\\xC2/) 문자열을 대체하려고했습니다.

아이디어가 있으십니까?

+1

1. 시도해 봤습니까? 'menu-force-encoding ("ISO-8859-1") encode ("UTF-8")' 2. 모든 .rb 파일의 맨 위에 "encoding # utf-8"문자열을 추가하십시오. 환경 설정을 확인하십시오 터미널에'$ echo LC_CTYPE'이 뭐래? – Kashyap

+0

1 단계가 오류와 함께 실패 했습니까 2 단계가 효과가 있습니까 3 단계에서 http://thegreyblog.blogspot.in/2012/02/ fix-mac-os-x-lions-ssh-utf-8-issues.html이 링크는 문제가 발생하지 않도록 프로그램을 실행해야하는 환경 설정을 가지고 있습니다 .. – Kashyap

답변

62
menu.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?') 

이 완벽하게 작동하지만 더 이상 오류가 없습니다 : 당신은 이상한 문자를 잃고 신경 쓰지 않는 경우

+1

환상적인 솔루션 - SQL Server에서 이상한 유형을 다루는 제 문제를 해결했습니다. 고맙습니다! –

+0

감사합니다. 나는 문서에 뛰어 들지 않고 답변을 찾는 것을 좋아합니다. –

+0

감사! 그것은 나를 위해, 미래의 참고 문헌 [http://www.ruby-doc.org/core-2.1.2/String.html#method-i-encode] – jmoreira

14

"\ xC2"에 대해 무엇을 기대합니까? 아마 Â

ASCII-8BIT를 사용하면 이진 데이터를 가지게되고 루비 캔트가 결정됩니다.

먼저 인코딩을 force_encoding으로 설정해야합니다.

Encoding.list.each{|enc| 
    begin 
    print "%-10s\t" % [enc] 
    print "\t\xC2".force_encoding(enc) 
    print "\t\xC2".force_encoding(enc).encode('utf-8') 
    rescue => err 
    print "\t#{err}" 
    end 
    print "\n" 
} 

결과는 당신의 "\ XC2"다른 인코딩에 사용할 수있는 값은 다음과 같습니다

는 다음과 같은 코드를 시도 할 수 있습니다.

결과는 출력 형식에 따라 다를 수 있지만 좋은 추측을 할 수 있다고 생각합니다. 어떤 인코딩을 사용하는지 생각해보십시오.

당신은 인코딩을 정의 할 때 (아마 CP1251) 당신이

menu.force_encoding('cp1252').to_json 

도 코멘트를 Kashyaps 볼 수 있어야합니다. 나는 몇 가지 추가 문자를 교체했다

str.force_encoding("ASCII-8BIT").encode('UTF-8', undef: :replace, replace: '') 
+0

이것은 내가 한 것입니다 : '인코딩 .list.each {| enc | begin "% -10s \ t"% [enc] 인쇄합니다. menu.to_json.force_encoding (enc) ')구조 => 인쇄 잘못 "\ T는 # {ERR}" 끝 인쇄 "\ n" } ' 을이 내가 각각의 결과를 가지고 무엇을 : 'SJIS - KDDI "\ XC2" ASCII-8BIT에서 UTF-8까지 – martriay

7

, 당신이 그들을 날려 버릴 수 있습니다.

+0

작동하지 않음 :( ASCII- 8BIT에서 UTF-8로/menu "\ xC2"의 인코딩 :: UndefinedConversionError – martriay

+3

menu.to_s.encode ('UTF-8', { : invalid => : replace, : undef => : replace, : replace => '?'}) ->이 작업이 성공했습니다! : D – martriay

6

자동 승인 솔루션이 작동하지 않으며 오류가 발생하지 않지만 JSON이 아닙니다.

나는 oj 보석을 사용하여 문제를 해결했다. 이제 발견된다. 또한 표준 JSON 라이브러리보다 빠릅니다.

을 writting :

menu_json = Oj.dump menu 

읽기 : 자세한 내용은

menu2 = Oj.load menu_json 

https://github.com/ohler55/oj.나는 그것이 도움이되기를 바랍니다.

+0

에 대한 공식적인 루비 의사도 문제가되었습니다. JSON 부분이 아닙니다. 따라서 자동 응답 기능이 작동합니다. 어쨌든, 나는 대체 솔루션을 제공하기 위해 당신을 업 그레 이드 할 것이다. – martriay

+0

글쎄, 나는 당신과 동의한다. 더 이상 오류는 없지만 json 문자열이 아니다. 목적은 무엇인지 모르지만 json을 다시로드해야하며 유효한 JSON 문자열이 필요했습니다. 또는 제안 된 솔루션에서 뭔가를 놓친 적이 있습니까? – gvo

+0

이 질문은 오류에 관한 것이 었 습니다만, 제 대답이 최선의 선택이라고 말하는 것이 아니며, 분명히 당신의 목적이 아니지만 제시된 문제를 해결합니다 : 인코딩 오류. 내 질문에 언급 한 JSON은 상황화 목적으로 사용됩니다. – martriay

관련 문제