2012-05-13 3 views
0

이것은 일반적인 질문이지만 신뢰할 수없는 정규식을 사용하지 않고 대답을 찾지 못하는 것 같습니다.루비에서 특수 문자 이스케이프

기본적으로 문자열에 \302\240 또는 유사한 조합이있는 경우 실제 문자로 바꾸고 싶습니다.

나는 이것을 위해 PLruby를 사용하고 있습니다. 따라서 경고합니다.

obj = {"a"=>"some string with special chars"} 
warn obj.inspect 
NOTICE: {"Outputs"=>["a\302\240b"]} <- chars are escaped 
warn "\302\240" 
NOTICE: <-- there is a non breaking space here, like I want 
warn "#{json.inspect}" 
NOTICE: {"Outputs"=>["a\302\240"b]} <- chars are escaped 
내가 문자열 리터럴을 사용할 때 그래서이 디코딩 할 수

하지만 "# {X}"포맷의 \ XXX 자리로는 문자로 디코딩되지 않습니다.

가운데 명령과 동일한 문자열을 어떻게 할당합니까?

루비 버전 : 1.8.5

+0

미안하지만 무슨 뜻인지 모르겠군요 ... 어쩌면 당신은 질문을 다시 말해야 할 것입니다. 특히 코드와 출력은 나에게 매우 이상하게 보입니다. –

+0

그냥 말도 안되는 이스케이프 처리없이 .inspect를 사용하고 싶습니다. – Keyo

+0

내장 유형을 검사하는 목적은 리터럴로 사용할 수있는 객체 표현을 제공하는 것입니다. 그건 "우스운"것이 아닙니다. 당신은 전혀 다른 것을 찾고있는 것 같아요, 아마도 해결책은 좋은 생각 일 것입니다. –

답변

2

당신은 PL/ruby를 사용하고 있다고 언급했습니다. 이는 문자열이 old "escape" format을 사용하여 실제로는 bytea 값 (PostgreSQL 버전의 BLOB)임을 의미합니다. 이스케이프 형식은 너무 gsubArray#pack의 약간을 분류한다 선두 \와 8 진수 ASCII가 아닌 값을 인코딩 : 원시 바이트 s에서 탈출 값을 확장 bytes에서 그들을 떠나

bytes = s.gsub(/\\([0-8]{3})/) { [ $1.to_i(8) ].pack('C') } 

. 여전히 바이너리 데이터를 다루고 있지만 콘솔에 표시하려고 할 때 반드시 유용한 것은 아닙니다. 이해할 수있는 문자열을 처리하고 있다는 것을 알고 있다면 인코딩이 무엇인지 파악하고 Iconv을 사용하여 인코딩을 정렬해야합니다.

+0

내가 찾고있는 것. 이스케이프 형식이 포스트그레스에 대해서는 괜찮 았지만 PLruby는 백 슬래시를 이스케이프 처리하여 \ xxx 파일을 테이블에 저장합니다. 감사. – Keyo

+0

@Keyo :'bytea '형식으로 작업하기위한 PostgreSQL 함수가 있습니다 : http://www.postgresql.org/docs/current/interactive/functions-binarystring.html#FUNCTIONS-BINARYSTRING-OTHER –

1

아마도 당신은 대신 .to_s를 사용하려면?

+0

필자는 inspect가 반환하는 출력과 같은 { "a"> "b"} json이 필요합니다. to_s는 전혀 다른 것을 사용합니다. 나는 \ xxx를 실제 문자로 대체하는 방법을 찾고있다. (이스케이프 해제한다.) – Keyo

+0

일부 값을 검사하고 검사 된 버전을 gsubbing하는 대신 json으로 변환하는 것이 더 낫지 않습니까? 'require 'json'을 시도하십시오; json = { "출력"=> [ "a \ 302 \ 240b"]}. to_json; json'을 넣으십시오. –