zoukankan      html  css  js  c++  java
  • PHP 获取中英文混合字符串长度

    通常情况下要想掌握一个字符串变量的长度[一般掌握其字数],自然想到 strlen

    |——

     
    $str = 'string';
    echo strlen($str); //6

    |——

     
    $str = "方言";
    echo strlen($str);//6

    问题来了,明明是两个字的怎么会得到6的结果:在PHP自带的函数中,strlen及mb_strlen都是通过计算字符串所占字节数来计算长度的,在不同的编码情况下,中文所占的字节数是不同的。在GBK/GB2312下,中文字符占2个字节,而在UTF-8下,中文字符占3个字节。

    [我们不需要掌握字节数,没有意义,只要掌握字数就行]

    |——

    $str = '你好,世界!';
    echo strlen($str);    // GBK或GB2312下输出12,UTF-8下输出18

    Wordpress 的代码可以借鉴

    |——

    $str = 'Hello,世界!';
    preg_match_all('/./us', $str, $match);
    echo count($match[0]);    // 输出9

    思路是用正则将字符串切割成单个字符,直接获取匹配到的结果,得到结果。

    但以上代码在UTF-8编码下并不能处理GBK/GB2312的中文字符串,因为GBK/GB2312的中文字符会被识别为两个字符而计算出来的中文字符数量会翻倍。

    |——

    $tmp = @iconv('gbk', 'utf-8', $str);
    if(!empty($tmp)){
        $str = $tmp;
    }
    preg_match_all('/./us', $str, $match);
    echo count($match[0]);

    这样可以做到utf-8 和gbk环境下的兼容,但是一般日常我们都是掌握编码环境的[utf-8];

    这样我们获取字符变量的字数就用:

    |——

    int iconv_strlen ( string $str [, string $charset = ini_get("iconv.internal_encoding") ] );

     

     

    参考:

    http://www.clanfei.com/2012/12/1671.html

  • 相关阅读:
    HDU 2116 Has the sum exceeded
    HDU 1233 还是畅通工程
    HDU 1234 开门人和关门人
    HDU 1283 最简单的计算机
    HDU 2552 三足鼎立
    HDU 1202 The calculation of GPA
    HDU 1248 寒冰王座
    HDU 1863 畅通工程
    HDU 1879 继续畅通工程
    颜色对话框CColorDialog,字体对话框CFontDialog使用实例
  • 原文地址:https://www.cnblogs.com/logon/p/3600149.html
Copyright © 2011-2022 走看看