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

Php 计算ASCII和Unicode混合字符串中的字符数,php,unicode,ascii,Php,Unicode,Ascii,用户名可以携带ASCII、Unicode或两者 示例: Jam123(ASCII)-6个字符 Unicode(Unicode)-3个字符,但strlen返回6个字节,因为Unicode是每个字符2个字节。 Jamت(Unicode和ASCII)-5个字符(3个ASCII和2个Unicode,尽管我只有一个Unicode字符) 在所有情况下,用户名不应超过25个字符,且不应少于4个字符 我的主要问题是,当将Unicode和ASCII混合在一起时,如何跟踪计数,以便条件语句能够判断用户名是否不超过2

用户名可以携带ASCII、Unicode或两者

示例:

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

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

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

strlen($username);
if(strlen($username)使用。它负责unicode字符

例如:

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

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


用UNICODE语句/字符串计数单词的函数:

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


然后做:


出人意料的是,它成功了!我以前尝试过这个解决方案,但没有成功…我想我大概是输入错误了…总之,小补丁mb_strlen()…感谢您需要额外的软件包mbstring:
sudo apt install php mbstring
所有的ASCII都是Unicode。并非所有的Unicode都是ASCII。@tchrist所有的ASCII都是UTF-8。并非所有的UTF-8都是ASCII。Unicode都不是。@user这对您来说可能是一本好书:谢谢您的建议…@deceze:您错了。ASCII是ISO-8859-1的子集,而ISO-8859-1是一个子集Unicode的et。Unicode是一个编码字符集。它将字符映射到代码。它的前128个代码点与另一个编码字符集ASCII使用的代码点完全相同。类似地,所有ISO 8859-1都是Unicode,但并非所有Unicode都是ISO 8859-1,因为Unicode的前256个代码点与拉丁语的所有代码点完全对应-1.此外,尽管Unicode具有类似于代理的代码点,这些代码点不能用一致的UTF-8表示,但一致的UTF-8不能表示非Unicode代码点。
<?php 
echo mb_strlen('ابت', 'UTF8'); // returns 3
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");