PHP报错 iconv(): Detected an illegal character in input string

本文介绍了一个PHP函数,用于计算包含中文字符的字符串的实际显示长度。通过使用iconv进行字符集转换,并结合strlen和ord函数来准确计算混合中英文字符的长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PHP代码报错如下:

代码如下:

$length = strLength('嗨暼足球啊');
var_dump($length);die;

function strLength($str,$charset='utf-8'){
    //GB2312表示的是简体中文,不支持像"囧"之类的更为复杂的汉字以及一些特殊字符,导致报错
    // if($charset=='utf-8') $str = iconv('utf-8','gb2312',$str);
    //忽略了不能转换的字符,避免了出错但却不能够正确地输出(即空白不输出)//结果输出为4
    // if($charset=='utf-8') $str = iconv('utf-8','gb2312//IGNORE',$str);
    //可以正确地输出,因为GBK支持的字符范围更广//结果输出为5
    if($charset=='utf-8') $str = iconv('utf-8','GBK',$str);
    $num = strlen($str);
    $cnNum = 0;
    for($i=0;$i<$num;$i++){
        if(ord(substr($str,$i+1,1))>127){
            $cnNum++;
            $i++;
        }
    }
    $enNum = $num-($cnNum*2);
    $number = ($enNum/2)+$cnNum;
    return ceil($number);
}


在ARM架构的系统中,`iconv`函数确实可以用来做UTF-8到GBK或者其他编码间的转换。然而,当你从GBK转换回UTF-8时,尤其是对于较长的GBK文本,由于UTF-8是一种变长编码,有些GBK字符对应于多个UTF-8字节,这可能导致`iconv`函数的参数列表变得非常长,超过了系统的默认限制。 当`iconv`函数接收到的源数据不能完全放入单次调用的参数列表中时,就会抛出"Argument list too long"这样的错误。这是因为`iconv`函数一次只能处理一段有限长度的输入,而UTF-8到GBK的逆向转换可能会生成比原始GBK文本更长的UTF-8序列。 为了解决这个问题,你需要将GBK数据拆分为较小的部分,然后逐个处理,或者使用循环遍历整个GBK文本,每次都调用`iconv`进行转换,直到所有内容都被处理完毕。这可以通过使用循环和临时缓冲区来实现。 例如,你可以这样做: ```c char *gbk_data = ...; // GBK数据 size_t gbk_len = ...; // GBK数据长度 // 创建临时缓冲区和iconv上下文 char utf8_buffer[1024]; iconv_t conv = iconv_open("UTF-8", "GBK"); // 转换方向 while (gbk_len > 0) { size_t to_convert = (gbk_len > sizeof(utf8_buffer)) ? sizeof(utf8_buffer) : gbk_len; size_t converted_bytes; if (iconv(conv, &gbk_data, &to_convert, utf8_buffer, &converted_bytes) == (size_t)-1) { // 处理错误,可能是因为超出了参数限制 } else { // 操作转换后的utf8_buffer process_utf8(utf8_buffer, converted_bytes); // 更新gbk_data和gbk_len gbk_data += converted_bytes; gbk_len -= converted_bytes; } } // 关闭iconv上下文 iconv_close(conv); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值