php iconv错误,php – 为什么iconv会产生非法字符错误?

我正试图从剧本中删除警告和通知.该脚本包括以下内容:

$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的任何建议,或者了解为什么会出现这种情况?

解决方法:

你的例子:

$string = $supplier . ' => ' . $product_name;

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

并使用PHP 5.2可能适合您.在以后的PHP版本中,如果输入不是精确的UTF-8,incov将丢弃该字符串(您将获得一个空字符串).到目前为止,你可能没有注意到它.

$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和多字节字符串)之间翻译the names of the encoding­Docs(和/或验证支持的编码).

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

标签:php,php-5-2

来源: https://codeday.me/bug/20190630/1331568.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值