如果向 iconv_strlen 传递包含格式错误序列的 UTF-8 字符串,它将返回 FALSE。这与 mb_strlen 或 utf8_decode 的行为形成对比,它们会删除任何格式错误的序列。
<?php
# 包含格式错误序列的 UTF-8 字符串:\xe9
$str = "I?t?rn?ti?n\xe9?liz?ti?n";
print "mb_strlen: ".mb_strlen($str,'UTF-8')."\n";
print "strlen/utf8_decode: ".strlen(utf8_decode($str))."\n";
print "iconv_strlen: ".iconv_strlen($str,'UTF-8')."\n";
?>
显示:
mb_strlen: 20
strlen/utf8_decode: 20
iconv_strlen
(PHP 5.0.5)
因此,它比 mb_strlen 更“严格”,这意味着您可能需要首先检查无效序列。一个快速检查方法是利用 PCRE 扩展的行为(参见模式修饰符的说明):
<?php
if (preg_match('/^.{1}/us',$str,$ar) != 1) {
die("string contains invalid UTF-8");
}
?>
可以在以下位置找到一个速度较慢但更严格的检查(正则表达式):http://www.w3.org/International/questions/qa-forms-utf-8
类似的规则适用于 iconv_substr、iconv_strpos 和 iconv_strrpos