2011-07-26 4 views
2

매우 쉽지만이 모든 백 슬래시로 매듭에 묶여 있습니다.백 슬래시를 추가하여 루비 문자열의 문자 인코딩을 수정하십시오.

웹 사이트에서 (정중하게) 내가 긁어 모으는 데이터가 있습니다. 때로는 다음과 같은 문장이 내게옵니다.

u00a362 000? you must be joking 

물론 '£ 2 000이되어야합니까? 너 농담해야한다 '. irb에서의 짧은 테스트가 그것을 해독했습니다.

ruby-1.9.2-p180 :001 > string = "u00a3" 
    => "u00a3" 
ruby-1.9.2-p180 :002 > string = "\u00a3" 
    => "£" 

물론 : 백 슬래시를 추가하면 디코딩됩니다.

puts str.gsub('u00', '\\u00') 

출력되는 \u00a3 결과 어떤 : 나는 this question의 도움으로 다음을 만들었습니다. 이것은 모두 좋고 좋지만, 문자열 자체에 £가되기를 원합니다. 단지 puts ing으로 충분하지 않습니다.

gsub('u00a3', '£') 다른 문자가 틀림 없으므로 좋지 않습니다. 실종입니다.

도움을 주셔서 감사합니다.

답변

0

경고, 다음은 정말 예쁘지 않습니다.

str = "u00a362 000? you must be joking" 
split_unicode = str.gsub(/(u00[a-z0-9]{2})/, "split_here\\1split_here").split(/split_here/) 
final = split_unicode.map do |elem| 
    if elem =~ /^u00/ 
    [("0x" + elem.gsub(/u00/, '')).hex].pack("U*") 
    else 
    elem 
    end 
end 
puts final.join 

여기서 u00xx 값을 찾아 16 진수로 변환하는 것이 좋습니다. 거기에서 우리는 메서드를 사용하여 올바른 유니 코드 문자를 출력 할 수 있습니다.

끔찍한 일 라이너로 크랭크를 날릴 수도 있습니다!

puts (str.gsub(/(u00[a-z0-9]{2})/, "split_here\\1split_here").split(/split_here/).map {|elem| elem =~ /^u00/ ? [("0x" + elem.gsub(/u00/, '')).hex].pack("U*") : elem}).join 

더 나은 해결책이있을 수 있습니다.하지만이 방법이 효과적입니다.

+0

안녕하세요, 대단히 감사합니다. 내 첫 번째 브러시 '팩'. 지도 안의 대괄호로 무엇을하고 있는지 알지 못합니까? 내가 irb에서 실행할 때, 나는 다음과 같은 것을 얻는다 :'£ 62 000? 너는 농담해야만한다. - 그 길잃은 사람은 어디에서 왔는가? – djb

+0

'Array # pack ("U *")'은 일반적으로 문자열의 모든 문자를 취해 그 유니 코드 비트 값을 배열에 넣는'String # unpack ("U *")'과 결합됩니다. 그래서 우리가 하나의 가치를 지녔다 할지라도 팩을 배열로 제공해야합니다. 어디에서 나오는 'Â'에 대해서는 전혀 모른다. 그것은 나를 위해 잘 작동합니다 ... – Vache

+0

OK - 나는'Â'이 다른 문제라고 생각합니다. 언제 어디서나'£ '를 붙일 때마다 나타나기 때문에 다른 곳에서 오는 것입니다. 이것은 내 문제를 해결합니다. 당신의 도움을 주셔서 감사합니다. – djb

0

들어오는 문자열을 변환하기 위해 Iconv 라이브러리를 사용해보십시오. stringex gem을 살펴볼 수도 있습니다. 그것은 "다른 방향으로 가라"는 방법을 가지고 있지만 당신이 찾고있는 매핑을 제공 할 수 있습니다. 만약 당신이 나쁜 인코딩을 가지고 있다면 그것을 올바르게하는 것이 불가능할 수 있다고 말했다.

관련 문제