2013-11-21 4 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) 
Смежные вопросы