7

这应该很简单,但我无法弄清楚。

有问题的网站是 UTF-8 编码的。

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

斯派塞-史密斯迷路了

它看起来像一个常规字符串,但是当您将该字符串复制到 notepad++ 之类的应用程序中时,您会看到一个“?” 出现在单词“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 引导我找到答案。我正在测试的字符串是客户从她使用的任何应用程序复制并粘贴它后我们的支持票证的输出。实际输入是

斯派塞-史密斯

4

3 回答 3

4

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

从 php 字符串中删除控制字符

于 2013-02-01T20:30:43.970 回答
1

这也可以

$chars = array("\r\n", '\\n', '\\r', "\n", "\r", "\t", "\0", "\x0B");
str_replace($chars,"<br>",$data);
于 2016-05-25T16:11:23.813 回答
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]);
于 2021-02-08T06:50:08.260 回答