В данной статье я рассмотрю подсчет символов в строке. В обычном случае может применяться стандартная функция strlen(). Но если у вас кириллица, то есть используется кодировка UTF-8, данные функции будут работать не так, как бы нам хотелось.
Приведем небольшой пример:
if (isset($_POST['fio']) && strlen($_POST['fio']') <= 8){
echo "Слишком мало информации в поле 'Фамилия, имя, отчество'!";
}
В данном примере мы проверяем данные, отправленные с текстового поля с name = 'fio' и если длина строки не превышает 8 символов, надеемся увидеть сообщение о том, что пользователь ввел мало информации и, естественно, не обрабатывать данные дальше.
Если пользователь вводит латиницу или спец. симаолы, то данный пример работает отлично.
Однако, если пользователь, например, будет работать с кириллицей (что нам и нужно), то при вводе даже 5 символов данное условие не сработает.
Посмотрим, что же тут не так. Введём, например, в тестовое поле слово 'тест' и обработаем следующим образом:
if (isset($_POST['fio'])){
echo "Количество введённых символов: " . strlen($_POST['fio']');
}
Получаем: Количество введённых символов: 8
Причина такого расхождения в ожидаемой и реальной длине — размер кириллических символов в UTF-8: по 2 байта вместо 1 для латинских. Функция strlen() считает длину строки в байтах, а не в буквах, и если буква занимает два байта, она засчитывается за две.
Синтаксис функции:
int iconv_strlen (string str [, string charset])
В отличие от strlen(), iconv_strlen() подсчитывает число символов на основании кодировки, переданной во втором не обязательном параметре, а не как простой подсчёт байтов в строке.
Необязательный параметр charset указывает кодировку, в которой следует интерпретировать строки. Если он опущен, по умолчанию, будет использоваться кодировка, определённая в iconv.internal_charset.
Теперь, если мы перепишем наш последний пример следующим образом, то получим:
if (isset($_POST['fio'])){
echo "Количество введённых символов: " . iconv_strlen($_POST['fio']', 'UTF-8');
}
Ввод пользователя: 'тест'.
Получаем: Количество введённых символов: 4
Решение второе. Используем функцию mb_strlen().
Синтаксис функции:
mb_strlen() возвращает количество символов в строке str, имеющих кодировку символов encoding. Многобайтный символ вычисляется как 1.
encoding - это кодировка символов для str. Если encoding опущен, используется внутренняя кодировка.
Проверим работу этой функции на нашем примере:
if (isset($_POST['fio'])){
echo "Количество введённых символов: " . mb_strlen($_POST['fio']', 'UTF-8');
}
Ввод пользователя: 'тест'.
Получаем: Количество введённых символов: 4
Ссылки по теме:
http://php.net/manual/ru/function.mb-strlen.php
http://php.su/functions/?mb-strlen
http://php.su/functions/?strlen
http://www.php.net/manual/ru/function.strlen.php
http://php.su/functions/?count
http://www.php.net/manual/ru/function.count.php
http://hu2.php.net/manual/ru/function.iconv-strlen.php
Приведем небольшой пример:
if (isset($_POST['fio']) && strlen($_POST['fio']') <= 8){
echo "Слишком мало информации в поле 'Фамилия, имя, отчество'!";
}
В данном примере мы проверяем данные, отправленные с текстового поля с name = 'fio' и если длина строки не превышает 8 символов, надеемся увидеть сообщение о том, что пользователь ввел мало информации и, естественно, не обрабатывать данные дальше.
Если пользователь вводит латиницу или спец. симаолы, то данный пример работает отлично.
Однако, если пользователь, например, будет работать с кириллицей (что нам и нужно), то при вводе даже 5 символов данное условие не сработает.
Посмотрим, что же тут не так. Введём, например, в тестовое поле слово 'тест' и обработаем следующим образом:
if (isset($_POST['fio'])){
echo "Количество введённых символов: " . strlen($_POST['fio']');
}
Получаем: Количество введённых символов: 8
Причина такого расхождения в ожидаемой и реальной длине — размер кириллических символов в UTF-8: по 2 байта вместо 1 для латинских. Функция strlen() считает длину строки в байтах, а не в буквах, и если буква занимает два байта, она засчитывается за две.
Что же делать?!!
Решение первое. Используем функцию iconv_strlen(), которая возвращает число символов в строке.Синтаксис функции:
int iconv_strlen (string str [, string charset])
В отличие от strlen(), iconv_strlen() подсчитывает число символов на основании кодировки, переданной во втором не обязательном параметре, а не как простой подсчёт байтов в строке.
Помните, что:
длина строки не обязательно будет соответствовать количеству байт в ней,
так как в различных кодировках различные символы кодируются различным количеством байт,
например, юникод может быть и двух-, и четырёхбайтным.
Необязательный параметр charset указывает кодировку, в которой следует интерпретировать строки. Если он опущен, по умолчанию, будет использоваться кодировка, определённая в iconv.internal_charset.
Теперь, если мы перепишем наш последний пример следующим образом, то получим:
if (isset($_POST['fio'])){
echo "Количество введённых символов: " . iconv_strlen($_POST['fio']', 'UTF-8');
}
Ввод пользователя: 'тест'.
Получаем: Количество введённых символов: 4
Решение второе. Используем функцию mb_strlen().
Синтаксис функции:
int mb_strlen
(string
$str
[, string $encoding
])mb_strlen() возвращает количество символов в строке str, имеющих кодировку символов encoding. Многобайтный символ вычисляется как 1.
encoding - это кодировка символов для str. Если encoding опущен, используется внутренняя кодировка.
Проверим работу этой функции на нашем примере:
if (isset($_POST['fio'])){
echo "Количество введённых символов: " . mb_strlen($_POST['fio']', 'UTF-8');
}
Ввод пользователя: 'тест'.
Получаем: Количество введённых символов: 4
Ссылки по теме:
http://php.net/manual/ru/function.mb-strlen.php
http://php.su/functions/?mb-strlen
http://php.su/functions/?strlen
http://www.php.net/manual/ru/function.strlen.php
http://php.su/functions/?count
http://www.php.net/manual/ru/function.count.php
http://hu2.php.net/manual/ru/function.iconv-strlen.php
Комментариев нет:
Отправить комментарий