将转义的Unicode字符转换回PostgreSQL中的实际字符 [英] Convert escaped Unicode character back to actual character in PostgreSQL
本文介绍了将转义的Unicode字符转换回PostgreSQL中的实际字符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
有没有办法如何将以下字符串转换回人的可读值?我有一些外部数据,其中所有非ASCII字符都被转义。
Is there a way how I can convert the following string back to the human-readable value? I have some external data where all non-ascii characters are escaped.
示例字符串:
16 StringProvider_111=Telefon\u00ED kontakty
17 StringProvider_116=Odpov\u011Bdn\u00E1 osoba
必需结果:
16 StringProvider_111=Telefoní kontakty
17 StringProvider_116=Odpovědná osoba
数据库具有UTF8编码和排序规则 cs_CZ.UTF-8
The database has UTF8 encoding and collation cs_CZ.UTF-8
推荐答案
一个老窍门是为此目的使用解析器:
One old trick is using parser for this purpose:
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注入易受攻击,所以你应该消除输入文本首先!
It works, but it is SQL injection vulnerable - so you should to sanitize input text first!
这里的可读性较低但是安全的版本 - 但是您必须手动指定一个字符作为转义符号:
Here is less readable, but safe version - but you have to manually specify one char as escape symbol:
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)
这篇关于将转义的Unicode字符转换回PostgreSQL中的实际字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文