2013-11-21 101 views
2

有沒有辦法將下列字符串轉換回人類可讀的值?我有一些外部數據,所有非ascii字符都會被轉義。將轉義的Unicode字符轉換回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) 
相關問題