Tom*_*eif 3 postgresql unicode encoding postgresql-9.1
有没有办法如何将以下字符串转换回人类可读的值?我有一些外部数据,其中所有非ascii字符都被转义.
示例字符串:
16 StringProvider_111=Telefon\u00ED kontakty
17 StringProvider_116=Odpov\u011Bdn\u00E1 osoba
Run Code Online (Sandbox Code Playgroud)
要求结果:
16 StringProvider_111=Telefoní kontakty
17 StringProvider_116=Odpov?dná osoba
Run Code Online (Sandbox Code Playgroud)
该数据库具有UTF8编码和排序规则 cs_CZ.UTF-8
一个老技巧是使用解析器来实现此目的:
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$
Run Code Online (Sandbox Code Playgroud)
它有效,但是SQL注入很容易受到攻击 - 所以你应该首先清理输入文本!
这里的可读性较差,但是安全版本 - 但您必须手动指定一个char作为转义符号:
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$
Run Code Online (Sandbox Code Playgroud)
结果
postgres=# select unescape('Odpov\u011Bdn\u00E1 osoba','^');
unescape
-----------------
Odpov?dná osoba
(1 row)
Run Code Online (Sandbox Code Playgroud)