gpt4 book ai didi

php - 如何处理用户输入的无效 UTF-8 字符

转载 作者:IT王子 更新时间:2023-10-29 00:59:10 25 4
gpt4 key购买 nike

我正在寻找有关如何处理来自用户的无效 UTF-8 输入的一般策略/建议。

即使我的 Web 应用程序使用 UTF-8,某些用户不知何故输入了无效字符。这会导致 PHP 的 json_encode() 出现错误。总的来说,这似乎是个坏主意。

W3C I18N FAQ: Multilingual Forms表示“如果收到非 UTF-8 数据,则应发回错误消息。”。

  • 在一个有几十个不同地方可以输入数据的网站中,具体应该如何做到这一点?
  • 您如何以有用的方式向用户展示错误?
  • 您如何临时存储和显示错误的表单数据,以免用户丢失所有文本?去掉坏字符?使用替换字符,如何使用?
  • 对于数据库中的现有数据,当检测到无效的 UTF-8 数据时,我应该尝试将其转换并保存回来(如何?utf8_encode ()?mb_convert_encoding() ?),还是保持原样数据库,但在 json_encode() 之前做了什么(什么?)?

我对 mbstring 扩展非常熟悉,并不是在问“UTF-8 如何在 PHP 中工作?”。我想请有实际情况经验的人给我一些建议,他们是如何处理这个问题的。

作为解决方案的一部分,我真的很想看到一个 快速 方法将无效字符转换为 U+FFFD .

最佳答案

accept-charset="UTF-8" 属性只是浏览器遵循的指南,它们不会被迫以这种方式提交。糟糕的表单提交机器人就是一个很好的例子......

我通常会忽略坏字符,无论是通过 iconv()或使用不太可靠的 utf8_encode()/utf8_decode()功能。如果您使用 iconv,您还可以选择音译坏字符。

这是一个使用 iconv() 的示例:

$str_ignore = iconv('UTF-8', 'UTF-8//IGNORE', $str);
$str_translit = iconv('UTF-8', 'UTF-8//TRANSLIT', $str);

如果您想向您的用户显示一条错误消息,我可能会以全局方式执行此操作,而不是按收到的每个值进行。这样的事情可能会很好:

function utf8_clean($str)
{
return iconv('UTF-8', 'UTF-8//IGNORE', $str);
}

$clean_GET = array_map('utf8_clean', $_GET);

if (serialize($_GET) != serialize($clean_GET))
{
$_GET = $clean_GET;
$error_msg = 'Your data is not valid UTF-8 and has been stripped.';
}

// $_GET is clean!

您可能还想规范化新行并去除(不)可见的控制字符,如下所示:

function Clean($string, $control = true)
{
$string = iconv('UTF-8', 'UTF-8//IGNORE', $string);

if ($control === true)
{
return preg_replace('~\p{C}+~u', '', $string);
}

return preg_replace(array('~\r\n?~', '~[^\P{C}\t\n]+~u'), array("\n", ''), $string);
}

从 UTF-8 转换为 Unicode 码位的代码:

function Codepoint($char)
{
$result = null;
$codepoint = unpack('N', iconv('UTF-8', 'UCS-4BE', $char));

if (is_array($codepoint) && array_key_exists(1, $codepoint))
{
$result = sprintf('U+%04X', $codepoint[1]);
}

return $result;
}

echo Codepoint('à'); // U+00E0
echo Codepoint('ひ'); // U+3072

可能比任何其他替代方案都快,但我还没有对它进行广泛的测试。


示例:

$string = 'hello world�';

// U+FFFEhello worldU+FFFD
echo preg_replace_callback('/[\p{So}\p{Cf}\p{Co}\p{Cs}\p{Cn}]/u', 'Bad_Codepoint', $string);

function Bad_Codepoint($string)
{
$result = array();

foreach ((array) $string as $char)
{
$codepoint = unpack('N', iconv('UTF-8', 'UCS-4BE', $char));

if (is_array($codepoint) && array_key_exists(1, $codepoint))
{
$result[] = sprintf('U+%04X', $codepoint[1]);
}
}

return implode('', $result);
}

这可能就是您要找的。

关于php - 如何处理用户输入的无效 UTF-8 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3715264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com