从字符串中删除隐藏字符

时间:2013-02-01 20:07:05

标签: php utf-8 character-encoding

这应该很简单,但我无法弄明白。

相关网站采用UTF-8编码。

客户在我们的网站上填写表格时遇到了问题。以下是他们输入的示例数据。

SPICER-SMITHS LOST

它看起来像一个常规字符串,但当你将该字符串复制到像记事本++这样的应用程序时,你会看到一个“?”出现在单词“SMITHS”(“SMITH?S”)中。

脚本清理字段并执行删除以下字符的额外步骤: "\r\n", "\n", "\r", "\t", "\0", "\x0B"

虽然没有抓住这个隐藏的角色。

有人知道这里发生了什么吗?

编辑:我正在使用php。这是我用来清理字段的函数:

function strip_hidden_chars($str)
{
    $chars = array("\r\n", "\n", "\r", "\t", "\0", "\x0B");

    $str = str_replace($chars," ",$str);

    return preg_replace('/\s+/',' ',$str);
}
编辑2:@thaJeztah引导我回答。我正在测试的字符串是客户从她正在使用的任何应用程序复制并粘贴它后我们的支持票据的输出。实际输入是

  

SPICER-SMITH'S

3 个答案:

答案 0 :(得分:4)

你可以试着看看这里;删除控制字符?

Remove control characters from php String

答案 1 :(得分:1)

这也适用

$chars = array("\r\n", '\\n', '\\r', "\n", "\r", "\t", "\0", "\x0B");
str_replace($chars,"<br>",$data);

答案 2 :(得分:0)

我曾经在从不同来源导入许多 csv 文件时遇到类似问题,其中很多条目都不是 UTF-8 字符。这是我所做的,最终适用于所有文件,旁边有解释注释:

$row[$id] = str_replace(chr(130), ',', $row[$id]);    // baseline single quote
$row[$id] = str_replace(chr(131), 'NLG', $row[$id]);  // florin
$row[$id] = str_replace(chr(132), '"', $row[$id]);    // baseline double quote
$row[$id] = str_replace(chr(133), '...', $row[$id]);  // ellipsis
$row[$id] = str_replace(chr(134), '**', $row[$id]);   // dagger (a second footnote)
$row[$id] = str_replace(chr(135), '***', $row[$id]);  // double dagger (a third footnote)
$row[$id] = str_replace(chr(136), '^', $row[$id]);    // circumflex accent
$row[$id] = str_replace(chr(137), 'o/oo', $row[$id]); // permile
$row[$id] = str_replace(chr(138), 'Sh', $row[$id]);   // S Hacek
$row[$id] = str_replace(chr(139), '<', $row[$id]);    // left single guillemet
$row[$id] = str_replace(chr(140), 'OE', $row[$id]);   // OE ligature
$row[$id] = str_replace(chr(145), "'", $row[$id]);    // left single quote
$row[$id] = str_replace(chr(146), "'", $row[$id]);    // right single quote
$row[$id] = str_replace(chr(147), '"', $row[$id]);    // left double quote
$row[$id] = str_replace(chr(148), '"', $row[$id]);    // right double quote
$row[$id] = str_replace(chr(149), '-', $row[$id]);    // bullet
$row[$id] = str_replace(chr(150), '-', $row[$id]);    // endash
$row[$id] = str_replace(chr(151), '--', $row[$id]);   // emdash
$row[$id] = str_replace(chr(152), '~', $row[$id]);    // tilde accent
$row[$id] = str_replace(chr(153), '(TM)', $row[$id]); // trademark ligature
$row[$id] = str_replace(chr(154), 'sh', $row[$id]);   // s Hacek
$row[$id] = str_replace(chr(155), '>', $row[$id]);    // right single guillemet
$row[$id] = str_replace(chr(156), 'oe', $row[$id]);   // oe ligature
$row[$id] = str_replace(chr(159), 'Y', $row[$id]);    // Y Dieresis
//force convert to ISO-8859-1 then convert back to UTF-8 to remove the rest of unknown hidden characters
$row[$id] = iconv("UTF-8","ISO-8859-1//IGNORE",$row[$id]);
$row[$id] = iconv("ISO-8859-1","UTF-8",$row[$id]);