【问题标题】:iconv UTF-8//IGNORE still produces "illegal character" erroriconv UTF-8//IGNORE 仍然产生“非法字符”错误
【发布时间】:2012-03-11 15:59:04
【问题描述】:
$string = iconv("UTF-8", "UTF-8//IGNORE", $string);

我认为这段代码会删除无效的 UTF-8 字符,但它会生成 [E_NOTICE] "iconv(): Detected an illegal character in input string"。我错过了什么,如何正确地从非法字符中去除字符串?

【问题讨论】:

标签: php utf-8 iconv


【解决方案1】:

输出字符集(第二个参数)应该不同于输入字符集(第一个参数)。如果它们相同,那么如果字符串中有非法的UTF-8字符,iconv将根据输入的字符集将其拒绝为非法。

【讨论】:

  • 您提出解决方案了吗?我实际上已经read that 这应该工作
  • 是的,我看过那个链接,但是看看这个github.com/EllisLab/CodeIgniter/issues/261。我的理解是 iconv 现在不进行输入编码 - 但我可能是错的。上面的链接还有一个替代解决方案的链接,地址为gist.github.com/1262496
  • 这是有道理的。我会先试试mb_convert_encoding($string, "UTF-8", "UTF-8"),如果不行,我会试试要点。谢谢!
  • 还请注意,iconv 依赖于正确设置的语言环境,因此请确保调用 setlocale(..);首先具有适当的值。根据语言环境,输出会有所不同。
  • 我现在没有我的代码,但我很确定iconv() 将允许它,如果你只是将其中一种编码指定为 UCS
【解决方案2】:

我知道 2 种方法来修复包含非法字符的 UTF-8 字符串:

  1. 非法字符将替换为问号(“?”):

$message = mb_convert_encoding($message, 'UTF-8', 'UTF-8');

  1. 非法字符将被删除L

$message = iconv('UTF-8', 'UTF-8//IGNORE', $message);

第二种方法实际上是有问题的。但就我而言,它不会产生任何E_NOTICE。我用error_reporting(E_ALL); 测试了不同的损坏的UTF-8 字符串,结果总是如预期的那样。自 2012 年以来可能发生了一些变化。我在 PHP 7.2.9 Win 上进行了测试。

【讨论】:

    【解决方案3】:

    我正在使用带有波纹管设置的 mb_convert_encoding 来删除无效字符

    ini_set('mbstring.substitute_character', "none");
    $string= mb_convert_encoding($string, 'UTF-8', 'UTF-8');
    

    它在我的情况下工作。早些时候我没有得到通知

    注意:iconv(): 字符集错误,不允许从UTF-8' to UTF-8//IGNORE' 转换

    $string= iconv('UTF-8', 'UTF-8//TRANSLIT//IGNORE', $string)
    

    【讨论】:

      【解决方案4】:

      要简单地忽略通知,您可以使用“@”:

      $string = @iconv("UTF-8", "UTF-8//IGNORE", $string);

      【讨论】:

      • 此时返回的字符串为空
      • 你不应该这样做,因为在某些情况下你可以获得空字符串。
      猜你喜欢
      • 2014-08-25
      • 2012-09-13
      • 2015-01-04
      • 1970-01-01
      • 2014-01-27
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      相关资源
      最近更新 更多