PHP:恢复转义的Unicode字符[重复]

Posted

技术标签:

【中文标题】PHP:恢复转义的Unicode字符[重复]【英文标题】:PHP: reverting escaped unicode characters [duplicate] 【发布时间】:2021-05-09 01:19:06 【问题描述】:

我必须将非 ASCII 字符编码为符号 \X--\ 的文本解析,其中 -- 是字符的 Unicode 编号。例如:

vis\XED\vel numa das imagens pr\XE9\vias \XE0\ administra\XE7\\XE3\o

应该转换成

visível numa das imagens prévias à administração

我可以像尼安德特人那样做:寻找“\X”,2 个字符后确认有“/”,用相应的字符替换整个内容,冲洗并重复,直到找不到更多匹配项。但是,肯定有更好的方法来做到这一点。

然后,我尝试使用正则表达式,这是我不太了解的东西。在 RegExr 上,我最终得到了符合我需要的正则表达式 '/\X\w2\/'。但是当我尝试将它与 preg_replace_callback() 一起使用时,特别是使用字符串 "/\\X\w2\\/" 作为正则表达式时,我收到“非法/不支持的转义序列”错误。我尝试了一些我在网上找到的其他正则表达式,无论是在这个网站上还是在其他地方,都无济于事。

最后,我也不太确定用适当的字符替换 Unicode 数字的最佳方法是什么。

所以,我的问题有两个:

• 查找转义字符的理想方法是什么?

• 如何从 Unicode 编号中获取 UTF 字符?

【问题讨论】:

一个问题——你的字符串不应该是administra\XE7\\XE3\o,而不是administra\XE7\XE3\o吗? @El_Vanja 确实!感谢您指出我的错误。现在已经修好了。 对于 REGEX 表达式,您应该双转义反斜杠以使其工作。所以在 REGEX 编辑器中的双反斜杠需要在 php 中变成三重反斜杠。 第二部分见this question。 @El_Vanja 感谢您的帮助!如果没有它,我需要很长时间才能弄清楚这一点。 【参考方案1】:

首先,正如Right way to escape backslash [ \ ] in PHP regex? 中提到的,应该使用4 个斜线来匹配反斜线。因此,正则表达式变为"/\\\\X\\w2\\\\/"

至于解码,我找到的最简单的方法是将转义字符转换为 html 实体格式并使用 html_entity_decode() 函数。因此,代码最终如下:

function unescapeText(string $str)

    return preg_replace_callback(
        "/\\\\X\\w2\\\\/",
        fn($m) => html_entity_decode('&#x'.substr($m[0], 2, 2).';', ENT_NOQUOTES, 'UTF-8'),
        $str
    );

最后一句忠告:一开始我遇到了一些麻烦,因为双引号将字符串转换为二进制;单引号将双反斜杠转义为 1(因此,\XE7\\XE3\ 将变为 \XE7\XE3\)。这导致了各种各样的问题。使用 Nowdoc 语法最终使文本按照我的意图进行了字面解释。

【讨论】:

以上是关于PHP:恢复转义的Unicode字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHP - json_encode(string, JSON_UNESCAPED_UNICODE) 不转义捷克字符

Unicode 转义序列

python基础篇----字符串unicode

json_encode如何防止汉字转义成unicode

whatsapp 是如何处理特殊字符、unicode 和 emoji 的

SyntaxError :( unicode错误)'unicodeescape'编解码器无法解码位置2-3的字节:截断 UXXXXXXXX转义[重复]