Подсчитать количество символов в смешанной строке ASCII и Unicode - PullRequest
1 голос
/ 04 сентября 2011
strlen($username);

Имя пользователя может содержать ASCII, Unicode или оба.

Пример:

Jam123 (ASCII) - 6 символов
ابت (Unicode) - 3 символа, но strlen возвращает 6 байтов, поскольку юникод равен 2 байта на символ.
Jam ت (Unicode и ASCII) - 5символы (3 ASCII и 2 Unicode, хотя у меня только один символ Unicode)

Имя пользователя во всех случаях не должно превышать 25 символов и должно быть не менее 4 символов.

Моя основная проблема заключается в том, что когда я смешиваю Unicode и ASCII вместе, как я могу отслеживать количество, чтобы оператор условия мог определить, является ли имя пользователя не больше 25 и не меньше 4.

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

3 символа в Юникоде будут считаться 6 байтами, что вызывает проблемы, поскольку позволяет пользователю иметь имя пользователя из 3 символов Юникода, если количество символов должно быть минимум 4.

Числа всегда будут в ASCII

Ответы [ 3 ]

4 голосов
/ 04 сентября 2011

Использование mb_strlen().Он заботится о символах Юникода.

Пример:

mb_strlen("Jamت", "UTF-8"); // 4
0 голосов
/ 24 декабря 2013

функция для подсчета слов в предложении / строке 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");
0 голосов
/ 04 сентября 2011

Вы можете использовать mb_strlen там, где вы выбираете кодировку.

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

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