4

我正在尝试消除脚本中的警告和通知。该脚本包括以下内容:

$clean_string = iconv('UTF-8', 'UTF-8//IGNORE', $supplier.' => '.$product_name);

据我了解,这一行的目的,正如脚本的原作者所期望的那样,是从字符串中删除非 UTF-8 字符,但显然输入中的任何非 UTF-8 字符都会导致 iconv抛出非法字符警告。

为了解决这个问题,我的想法是执行以下操作:

$clean_string = iconv(mb_detect_encoding($supplier.' => '.$product_name), 'UTF-8//IGNORE', $supplier.' => '.$product_name);

然而奇怪的是,mb_detect_encoding()UTF-8作为检测到的编码返回!

带有重音符号 ( é) 的字母 e 是导致此行为的字符示例。

我意识到我在检测和转换之间混合了多字节库,但是我在 iconv 库中找不到编码检测功能。

我考虑过使用 mb_convert_encoding() 函数将字符串清理为 UTF-8,但 PHP 文档不清楚无法表示的字符会发生什么。

我正在使用 PHP 5.2.17,并使用 glibc iconv 实现,库版本 2.5。

谁能提供有关如何将字符串清理为 UTF-8 的任何建议,或者深入了解为什么会发生这种行为?

4

1 回答 1

3

你的例子:

$string     = $supplier . ' => ' . $product_name;
$stringUtf8 = iconv('UTF-8', 'UTF-8//IGNORE', $string);

并且使用 PHP 5.2 可能对您有用。在以后的 PHP 版本中,如果输入不是精确的 UTF-8,incov 将删除该字符串(您将得到一个空字符串)。就您而言,您可能没有意识到这一点。

然后您尝试使用mb_detect_encodingDocs来了解原始编码:

$string     = $supplier . ' => ' . $product_name;
$encoding   = mb_detect_encoding($string);
$stringUtf8 = iconv($encoding, 'UTF-8//IGNORE', $string);

正如我已经在评论中链接的那样,mb_detect_encoding 正在做一些魔术并且无法正常工作。它试图帮助你,但是,它不能很好地检测到编码。这是由主题的问题。您可以尝试将严格模式设置为 true:

$order      = mb_detect_order();
$encoding   = mb_detect_encoding($string, $order, true);
if (FALSE === $encoding) {
    throw new UnexpectedValueException(
        sprintf(
            'Unable to detect input encoding with mb_detect_encoding, order was: %s'
            , print_r($order, true)
        )
     );
}

除此之外,您可能还需要在两个库(iconv 和多字节字符串)之间翻译编码文档的名称(和/或验证支持的编码)。

希望这有助于您至少更好地理解为什么有些事情可能不起作用,以及如何更好地找到错误案例并使用标准 PHP 扩展过滤输入。

于 2012-09-21T10:46:39.393 回答