Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/55: Рейтинг темы: голосов - 55, средняя оценка - 4.60
работяга
368 / 368 / 52
Регистрация: 23.05.2010
Сообщений: 947

Длина строки в байтах strlen

20.11.2015, 13:43. Показов 11551. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Прошу помощи.

Обновил php до версии 5.6.15

PHP
1
2
3
4
5
$str = 'привет мир';
$count = strlen($str);
 
var_dump($str);
echo $count;
результат:
string(19) "привет мир"
10

Вопрос такой: почему strlen возвращает 10, а не 19? Если верить документации, то эта функция должна возвращать количество байт, а не число символов в строке. Кодировка utf-8.

На другом хостинге с другой версией php возвращается 19. Это баг конкретной версии php или я чего-то не знаю?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2015, 13:43
Ответы с готовыми решениями:

Длина строки в байтах
Здравстсвуйте. Подскажите, пожалуйста, как можно подсчитать длину строки в байтах?

Длина слова в байтах
Написать программу, позволяющей дополнительно вставить в текст после каждого слова его длину в байтах. Помогите и надтолкните на мыслю...

Даны две переменные, в первой строка, во второй длина строки, 100 - max длина, строки. Что такое dup('$') ?
string db 100 stringlen db ?,100 dup('$')

8
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
20.11.2015, 13:44
mb_strlen()
0
работяга
368 / 368 / 52
Регистрация: 23.05.2010
Сообщений: 947
20.11.2015, 13:55  [ТС]
Нет, не то. И mb_strlen, и iconv_strlen возвращают 10
0
10 / 10 / 7
Регистрация: 18.10.2015
Сообщений: 160
20.11.2015, 14:47
возвращает 10 для CP1251 а для UTF-8 - 19

PHP
1
2
3
4
5
6
7
$text = 'привет мир';
$Utf8Text = iconv('CP1251', 'UTF-8', $text);
 
var_dump(array(
    'CP1251' => array($text,     strlen($text)),
    'UTF-8' =>  array($Utf8Text, strlen($Utf8Text)))
);
2
32 / 31 / 10
Регистрация: 26.11.2013
Сообщений: 93
20.11.2015, 15:06
centos 7.1/php 5.6.13
string(19) "привет мир" 19
полет нормальный
1
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
20.11.2015, 23:01
Цитата Сообщение от etalord Посмотреть сообщение
результат:
string(19) "привет мир"
10
Вот скрипт в кодировке UTF-8:
PHP
1
2
3
4
5
6
<?php
$str = 'привет мир';
$count = strlen($str);
 
var_dump($str);
echo $count;
Результат:
Code
1
2
string(19) "привет мир"
19
1
работяга
368 / 368 / 52
Регистрация: 23.05.2010
Сообщений: 947
23.11.2015, 21:11  [ТС]
Спасибо за ответы, к сожалению, пока так
PHP
1
2
3
4
5
6
7
$str = 'привет мир';
$count = strlen($str);
 
echo mb_detect_encoding($str);
echo '<br />';
var_dump($str);
var_dump($count);
Вывод:
UTF-8
string(19) "привет мир"
int(10)

Даже не знаю, где искать причину

Добавлено через 18 часов 32 минуты
Помог сотрудник поддержки битрикса - Павел Рожкин, спасибо ему. Причина была в настройках mbstring.func_overload=2 и mbstring.internal_encoding=utf-8. При "перегрузке" функция strlen превращается в mb_strlen, которая, в свою очередь, считает многобайтные символы за 1.

Подробнее:
http://php.net/manual/ru/mbstring.overload.php
http://php.net/manual/ru/function.mb-strlen.php

По идее, меня должна спасти функция iconv_strlen, но почему-то на моём хостинге она работает не так, как на других (проверял):
PHP
1
2
3
4
5
$str = 'привет мир';
var_dump($str);
 
echo strlen($str);
echo iconv_strlen($str);
Результат:
string(19) "привет мир"
10
10

А должно:
string(19) "привет мир"
10
19

Добавлено через 9 часов 48 минут
Я всё-таки разобрался. У меня не было выставлено значение iconv.internal_encoding. Именно оно используется по умолчанию функцией iconv_strlen(). Выставив значение второго параметра в ISO-8859-1, я добился правильного результата
PHP
1
iconv_strlen($str, 'ISO-8859-1');
Значение это подсмотрел с хостинга, где всё работало, вызвав ini_get_all()

Почему так произошло? Я обновлял окружение, а начиная с версии php 5.6 этот параметр признан устаревшим и вообще рекомендуется оставлять пустым. Вместо этого используется default_charset и вообще utf-8 становится кодировкой по умолчанию (вместо ISO-8859-1, полагаю). Подробнее в документации:

http://php.net/manual/ru/function.iconv-strlen.php
http://php.net/manual/ru/iconv.configuration.php
http://php.net/manual/ru/ini.c... lt-charset

На этом тему можно закрывать, потому что глубже я копать не собираюсь
2
10 / 10 / 3
Регистрация: 28.07.2013
Сообщений: 181
23.04.2018, 12:34
Спасибо, мне помогла подсказка про mbstring.func_overload=2. У меня Битрикс на 5.6 и второй сайт на 7.1 разные результаты по одной и той же строке выдавали. Теперь ясно!
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
23.04.2018, 21:51
PHP
1
var_dump(mb_strlen('привет мир', '8bit'));
Позволяет получить размер строки в байтах независимо от параметра mbstring.func_overload
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.04.2018, 21:51
Помогаю со студенческими работами здесь

появилась загвоздка с функцией. нужно вывести на экран строку, сост. из звездочек. Длина строки-параметр функциииз звезд. длина строки -
Я видела, что на форуме есть подобные задачи, но ни одно из их решений не работает на моем dev cpp.:( вот вариант решения, но он не...

Почему в коде записано strlen()+1 вместо strlen()
здравствуйте. объясните пожалуйста. почему для выделения места на основе размера уже существующей строки используется значение...

Последний символ строки (strlen и substr)
Есть код, который записывает в файл количество посещений данной страницы. При каждом десятом посещении выводится некоторое сообщение. По...

Получить размер строки в байтах
Добрый день! Имеется, например, следующая строка: int a = rand() % 1000, b = rand() % 200; string s = &quot;a = &quot; + to_string(a) +...

Функция strlen возвращает неверную длину строки
#include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;cstdio&gt; using namespace std; int main () { wchar_t x; char str; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru