计算ASCII和Unicode混合字符串中的字符数

时间:2011-09-03 21:38:56

标签: php unicode ascii

strlen($username);

用户名可以带有ASCII,Unicode或两者。

示例:

Jam123(ASCII) - 6个字符
ابت(Unicode) - 3个字符,但是strlen返回6个字节,因为unicode是每个字符2个字节。
Jamت(Unicode和ASCII) - 5个字符(3个ASCII和2个Unicode,即使我只有一个unicode字符)

所有情况下的用户名不得超过25个字符,且不得少于4个字符。

我的主要问题是当将Unicode和ASCII混合在一起时,如何跟踪计数,以便条件语句可以判断用户名是否不超过25且不低于4.

if(strlen($username) <= 25 && !(strlen($username) < 4))

unicode中的3个字符将被计为6个字节,这会导致麻烦,因为它允许用户在字符数最小为4时拥有3个unicode字符的用户名。

数字将始终为ASCII

3 个答案:

答案 0 :(得分:4)

使用mb_strlen()。它负责unicode字符。

示例:

mb_strlen("Jamت", "UTF-8"); // 4

答案 1 :(得分:0)

您可以在选择编码的地方使用mb_strlen。

http://sandbox.phpcode.eu/g/3a144/1

<?php 
echo mb_strlen('ابت', 'UTF8'); // returns 3

答案 2 :(得分:0)

计算UNICODE句子/字符串中的单词的函数:

function mb_count_words($string) 
{
    preg_match_all('/[\pL\pN\pPd]+/u', $string, $matches);  return count($matches[0]);
}

function mb_count_words($string, $format = 0, $charlist = '[]') {
    $string=trim($string);
    if(empty($string))
        $words = array();
    else
        $words = preg_split('~[^\p{L}\p{N}\']+~u',$string);
    switch ($format) {
        case 0:
            return count($words);
            break;
        case 1:
        case 2:
            return $words;
            break;
        default:
            return $words;
            break;
    }
}


然后做:

echo mb_count_words("chào buổi sáng");