【问题标题】:Strip hidden character from string从字符串中去除隐藏字符
【发布时间】:2013-01-17 05:29:48
【问题描述】:

这应该很简单,但我想不通。

相关网站采用 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 引导我找到答案。我正在测试的字符串是客户从她使用的任何应用程序复制并粘贴它后我们的支持票证的输出。实际输入是

斯派瑟-史密斯

【问题讨论】:

  • 您使用什么脚本语言?你能包括用于去除隐藏字符的代码吗?
  • 谢谢,我编辑了我的帖子。
  • 我发现是这个字符fileformat.info/info/unicode/char/92/index.htm我只是不知道如何去掉它。
  • 顺便说一句,您可以使用正则表达式 '/(?=[^\n\r\t])\p{Cc}/u'.. 删除控制字符。它还处理鲜为人知的 c1 控件,而不仅仅是 ASCII。

标签: php utf-8 character-encoding


【解决方案1】:

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

Remove control characters from php String

【讨论】:

  • 感谢您的发现。我在那里尝试了一些东西,但仍然无法正常工作。
  • 我接受了你的回答,因为它让我意识到我正在测试输出而不是最初输入的内容。
  • @BillH 你能更新你的问题并添加你为解决问题所做的事情吗?试图保持 StackOverflow 的质量 :)
【解决方案2】:

这个也可以

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

【讨论】:

    【解决方案3】:

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

    $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]);
    

    【讨论】:

      猜你喜欢
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      相关资源
      最近更新 更多