问题提醒:
"...我注意到像 ''' 这样的字符被替换为 ’... 我决定
下载后用实际值替换此类垃圾字符
数据。我需要的是这样的垃圾字符串列表及其
等效字符。”
严格处理这部分:
"我需要的是这样的垃圾字符串列表和它们的等价物
字符。”
使用 php,您可以生成这些字符及其等价物。使用所有 1,111,998 个 Unicode 点或 109,449 个 Utf8 符号是不切实际的。您可以在 和 Ă 之间的以下循环中使用 ASCII 范围或与您的上下文更相关的另一个范围。
<?php
for ($i=128; $i<258; $i++)
$tmp1 .= "<tr><td>".htmlentities("&#$i;")."</td><td>".html_entity_decode("&#".$i.";",ENT_NOQUOTES,"utf-8")."</td><td>&#".$i.";</td></tr>";
echo "<table border=1>
<tr><td>&#</td><td>"Garbage"</td><td>symbol</td></tr>";
echo $tmp1;
echo "</table>";
?>
根据经验,在 ASCII 上下文中,大多数“垃圾”符号起源于 到 ā +(很少)῁ 到 ‶ 的范围内。
为了显示“垃圾”符号,必须将 html 页面字符集设置为 iso-1 或首先导致问题的任何其他字符集。如果字符集设置为 utf-8,它们将不会显示。
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
.
“我决定用实际值替换这些垃圾字符
下载数据后”
您不能使用 php utf8_decode() 撤消“垃圾”,这实际上会在已经“垃圾”上创建更多“垃圾”。但是,您可以使用简单快速的搜索和替换 php str_replace() 函数。
首先,为您希望替换的每组“垃圾”符号生成 2 个数组。第一个数组是搜索词:
<?php
//ISO 8859-1 (Latin-1) special chars are found in the range 128 to 257
$tmp1 = "\$SearchArr = array(";
for ($i=128; $i<258; $i++)
$tmp1 .= "\"".html_entity_decode("&#".$i.";",ENT_NOQUOTES,"utf-8")."\", ";
$tmp1 = substr($tmp1,0,strlen($tmp1)-2);//erases last comma
$tmp1 .= ");";
$tmp1 = htmlentities($tmp1,ENT_NOQUOTES,"utf-8");
?>
第二个数组是替换项:
<?php
//Adapt for your relevant range.
$tmp2 = "\$ReplaceArr = array(\n";
for ($i=128; $i<258; $i++)
$tmp2 .= "\"&#".$i.";\", ";
$tmp2 = substr($tmp2,0,strlen($tmp2)-2);//erases last comma
$tmp2 .= ");";
echo $tmp1."\n<br><br>\n";
echo $tmp2."\n";
?>
现在,您有 2 个数组,您可以复制和粘贴它们以使用和重复使用来清除任何受感染的字符串,如下所示:
$InfectedString = str_replace($SearchArr,$ReplaceArr,$InfectedString);
注意:utf8_decode() 对清理“垃圾”符号没有帮助。但是,它可以用来防止进一步的污染。或者,mb_ 函数可能很有用。