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

查看:89
本文介绍了将转义的 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=Telefonu00ED kontakty
17 StringProvider_116=Odpovu011Bdnu00E1 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'Telefonu00ED 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('Odpovu011Bdnu00E1 osoba','^');
    unescape     
-----------------
 Odpovědná osoba
(1 row)

这篇关于将转义的 Unicode 字符转换回 PostgreSQL 中的实际字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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