2013-11-21 3 views
2

다음 문자열을 사람이 읽을 수있는 값으로 다시 변환하는 방법이 있습니까? 모든 비 ASCII 문자가 이스케이프 처리되는 일부 외부 데이터가 있습니다.이스케이프 된 유니 코드 문자를 PostgreSQL의 실제 문자로 변환하십시오.

예 문자열 :

16 StringProvider_111=Telefon\u00ED kontakty 
17 StringProvider_116=Odpov\u011Bdn\u00E1 osoba 

필수 결과 :

16 StringProvider_111=Telefoní kontakty 
17 StringProvider_116=Odpovědná osoba 

SQLFiddle

데이터베이스가 UTF8 인코딩 및 정렬을 사용 cs_CZ.UTF-8

+1

: HTTP : /을 /stackoverflow.com/q/10111654/398670 및 이에 대한 자세한 설명이 있습니다. http://stackoverflow.com/q/23659685/398670 –

답변

5

한 오래 된 트릭이 목적을 위해 파서를 사용하고 있습니다 :

postgres=# select e'Telefon\u00ED kontakty'; 
    ?column?  
------------------- 
Telefoní kontakty 
(1 row) 

CREATE OR REPLACE FUNCTION public.unescape(text) 
RETURNS text 
LANGUAGE plpgsql 
AS $function$ 
DECLARE result text; 
BEGIN 
    EXECUTE format('SELECT e''%s''', $1) INTO result; 
    RETURN result; 
END; 
$function$ 

효과가 있지만 SQL 인젝션 취약성이 있으므로 입력 텍스트를 먼저 살균해야합니다! 여기

덜 읽을 수 있지만, 안전 버전입니다 -하지만 당신은 수동으로 탈출 상징으로 하나 개의 문자 지정해야합니다 :

CREATE OR REPLACE FUNCTION public.unescape(text, text) 
RETURNS text 
LANGUAGE plpgsql 
AS $function$ 
DECLARE result text; 
BEGIN 
    EXECUTE format('SELECT U&%s UESCAPE %s', 
         quote_literal(replace($1, '\u','^')), 
         quote_literal($2)) INTO result; 
    RETURN result; 
END; 
$function$ 

결과

또 다른 유용한 답변이 중복에
postgres=# select unescape('Odpov\u011Bdn\u00E1 osoba','^'); 
    unescape  
----------------- 
Odpovědná osoba 
(1 row) 
관련 문제