从 PHP 中的 UTF-8 字符串中删除控制字符

2022-08-30 21:17:14

因此,我正在客户端(输入后)删除控制字符(制表符,cr,lf,\v和所有其他不可见字符),但由于客户端不可信,我也必须在服务器中删除它们。

所以根据这个链接 http://www.utf8-chartable.de/

控制字符从x00到1F,从7F到9F,因此我的客户端(javascript)控制字符删除函数是:

return s.replace(/[\x00-\x1F\x7F-\x9F]/g, "");

而我的php(服务器)控制字符删除功能是:

$s = preg_replace('/[\x00-\x1F\x7F-\x9F]/', '', $s);

现在,这似乎只会在 PHP 中为国际 utf8 字符(如 ς (xCF x82))带来问题(因为 x82 位于第二个序列组内),javascript 等效项不会产生任何问题。

现在我的问题是,我应该从7F到9F中删除控制字符吗?据我所知,从127到159(7F到9F)的序列显然可以成为有效的UTF-8字符串的一部分?

另外,也许我甚至不应该过滤00到31个控制字符,因为其中一些字符也可以出现在一些奇怪的(日语?中文?)但有效的utf-8字符中?


答案 1

似乎我只需要将u标志添加到正则表达式中,因此它变成了:

$s = preg_replace('/[\x00-\x1F\x7F-\x9F]/u', '', $s);

答案 2

我应该删除从 7F 到 9F 的控制字符吗?据我所知,从127到159(7F到9F)的序列显然可以成为有效的UTF-8字符串的一部分?

除了 ,您不应该这样做,因为 UTF-8 中表示为 ,因为它们是 UTF-8 中的较低代理项。\x7F\x7F


也许我甚至不应该过滤00到31个控制字符,因为其中一些字符也可以出现在一些奇怪的(日语?中文?)但有效的utf-8字符中?

这些控制字符仍然是 UTF-8 中的控制字符。他们的存在可能意味着莫吉巴克;如果要更正它,请保留它们,否则,请将其过滤掉。