将转义的Unicode字符转换回PostgreSQL中的实际字符 [英] Convert escaped Unicode character back to actual character in PostgreSQL

查看:162
本文介绍了将转义的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

SQLFiddle

数据库具有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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆