2011-09-29 5 views
1

저는 데이터베이스에 \ 303 \ 255와 같은 문자열을 가지고 있습니다.루비 문자열 표현

어떻게 그 8 문자 표현을 변환 할 수 있습니까?

나는 그들을 모두 바꿀 수는 있지만 다른 방법은 없습니까?

+0

인코딩 기능 : 우리는 우리가 eval는 '내가 가서이이 일을 아마 안전 말할 것이다 여기에서 보내고있는 무슨의 형식을 검증하고 있음을 감안할 때? UTF-8? –

+0

예, 인코딩은 UTF-8입니다. – kaydara

+0

문자열이'str = "\"\\ 303 \\ 255 \ ""'(즉, 슬래시는 실제로 문자열에 있습니까?)라는 의미입니까? 그렇다면 그것들을 추출하고'Array # pack'해야합니다. – d11wtq

답변

0

config (설정)하기 위해 다음 두 줄을 추가하려고하고, 다만 오해 할 수 있습니다.

나는 이걸로 싸웠다. 꽤 아니야. 이 문자열을 구문 분석하고 pack을 사용하여 관련 바이트를 압축합니다.

"foo \\303\\255 bar".gsub(/(\\\d{3})+/) do |match| 
    match[1..-1].split("\\").map{ |octet| octet.to_i(8) }.pack("c*") 
end.force_encoding("UTF-8") 

는 훨씬 짧은 버전 eval를 사용하지만 잘못 사용하면 그것은 거대한 보안 위험이 있기 때문에 그것은 항상 eval 당신이 할 수있는 경우를 피하기 위해 노력하고 가치가있다.

"foo \\303\\255 bar".gsub(/(\\\d{3})+/) { |m| eval('"' + m + '"') } 
+0

평가가 작동합니다! 첫 번째 OS가 작동하지 않는 이유를 확인합니다 ... 많은 사람에게 감사드립니다! : D – kaydara

+0

안전하다고 알고있는 문자열의 비트 만 평가했는지 확인하십시오. 그렇지 않으면 (혼란에 빠질 수있는 경우). 내 코드는 괜찮지 만, 전체 문자열을'eval'하는 것은 가능할 수 있지만 위험 할 수 있습니다. – d11wtq

+0

내부 및 개인 데이터 변환이므로 eval을 사용하는 것이 좋습니다. 그러나 경고에 감사드립니다! – kaydara

1

문자열에 실제로 8 문자가 아니라 2 바이트입니다. 난 당신이 í으로 표시하는 255 \ 303 \ 원하는 위치 모르겠지만 당신이 당신의 .rb 파일의 상단에

# encoding: utf-8 

를 넣으면 루비는 UTF-8을 사용합니다. 당신은 루비 온 레일즈를 사용하는 경우

당신은 당신이 설명으로 문제가 정말 가정/environment.rb에

Encoding.default_external = Encoding::UTF_8 
Encoding.default_internal = Encoding::UTF_8 
+0

상단의 인코딩이 작동하지 않았습니다. 평가에 성공했습니다. Jonas – kaydara