Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Работа со строками PHP-7 (кириллица) utf-8
Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2018
Помог: 0 раз(а)
Всем привет! Я только начал изучать PHP. Установил локально, у себя на машине (ubuntu 16.04) LAMP - Apache2, PHP-7, mysql, phpmyadmin. Все вроде работает, кириллица отображается правильно.... HO! Я уже второй день бьюсь с такой проблемой....
Соответственно strlen($string) - тоже не правильно работает. И все действия (функции) со строками в кириллице приводит к такому результату... Такие "ромбики" выдает интерпретатор в Atom, Sublime, VS-Code, phpStorm ну и веб-страница соответственно.
Кодировка файла проверенно неоднократо! UTF-8 без BOM
Добавил в .htaccess - AddDefaultCharset UTF-8
В сам файл test.php - header('Content-Type: text/html; charset=utf-8');
Проверил все файлы php.ini и apache2 - везде стоит default_charset UTF-8 Ничего не помогает!
Отчаянно прошу помощи! Как правильно настроить кодировку рабочего окружения для PHP....
Покинул форум
Сообщений всего: 13
Дата рег-ции: Апр. 2018
Помог: 0 раз(а)
mbstring подключили?
Мелкий
Отправлено: 21 Апреля, 2018 - 22:49:18
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
$word[0] - обращение побайтовое, о чем есть предупреждение в мануале.
strlen, как и большинство старых строковых функций - аналогично работают с байтами, а не символами. И об этом варнинги тоже были понаписаны.
Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2018
Помог: 0 раз(а)
Мелкий пишет:
$word[0] - обращение побайтовое, о чем есть предупреждение в мануале.
strlen, как и большинство старых строковых функций - аналогично работают с байтами, а не символами. И об этом варнинги тоже были понаписаны.
От настроек окружения не зависит. Разве только упомянуть уже deprecated гайку mbstring.func_overload
Спасибо за ответ... но зачем же столько агрессии, я ведь только учусь...
deprecated гайку mbstring.func_overload - я не понимаю о чем речь. Можете объяснить подробнее
По-моему в PHP-5.6 таких проблем не наблюдалось (Добавление)
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 73 раз(а)
dikoobraz пишет:
а что делать с примером посложнее
Транслит обычно пишут на основе поиска с заменой.
Т.е., берёте два массива, в первом массиве у вас русский алфавит, во втором - аналог русского алфавита но англ.буквами (латиница, проще говоря).
Передаёте оба эти массива к примеру в str_replace(), ну и третьим параметром передаёте обрабатываемую строку. (Добавление) dikoobraz, а конкретно с вашим примером можно просто записать так:
Покинул форум
Сообщений всего: 13
Дата рег-ции: Апр. 2018
Помог: 0 раз(а)
Это проблема PHP с самого его рождения
php.ini mbstring.func_overload в 2, функции заменятся аналогами из mbstring
либо если не хотите чтобы замена была везде автоматической, используйте аналоги из mbstring вручную, например вместо strlen() mb_strlen(), в unix само расширение должно быть по дефолту подключено
dikoobraz
Отправлено: 21 Апреля, 2018 - 23:30:54
Новичок
Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2018
Помог: 0 раз(а)
Я очень хочу, что бы замена была автоматической....
Подскажите как настроить такую автоматическую замену... и будет ли она работать на хосте у провайдера... тоже вопрос....
Raziel
Отправлено: 21 Апреля, 2018 - 23:33:44
Новичок
Покинул форум
Сообщений всего: 13
Дата рег-ции: Апр. 2018
Помог: 0 раз(а)
Если хостинг VPS/VDS то должен быть доступ к php.ini там замените
;mbstring.func_overload = 0 на
mbstring.func_overload = 2
Если нет используйте функции этого модуля вместо стандартных http://php.net/manual/ru/ref.mbstring.php
Здесь их список
dikoobraz
Отправлено: 21 Апреля, 2018 - 23:37:22
Новичок
Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2018
Помог: 0 раз(а)
Строитель Спасибо за функцию strtr().... не знал (Добавление) Raziel Спасибо, сейчас буду пробовать настроить
Строитель
Отправлено: 21 Апреля, 2018 - 23:40:58
Участник
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 73 раз(а)
dikoobraz пишет:
Спасибо за функцию strtr().... не знал
Если очень хочется манипулировать подстроками (символами в строках), то нужно смотреть в сторону регулярных выражений.
dikoobraz
Отправлено: 21 Апреля, 2018 - 23:42:34
Новичок
Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2018
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 73 раз(а)
dikoobraz пишет:
С регулярками у меня плохи дела...
Это так вначале только кажется - после первого внимательного прочтения мануала становится всё понятнее. А ещё есть хорошая книга "Регулярные выражения" Джеффри Фридла.
Мелкий
Отправлено: 22 Апреля, 2018 - 00:14:10
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
dikoobraz пишет:
По-моему в PHP-5.6 таких проблем не наблюдалось
Наблюдались, наблюдались. И в PHP4 тоже, и раньше (хотя PHP3 я не собирал даже из интереса). И в основном именно поэтому поведение и функций и обращения к строке как к массиву байт сохраняется до сих пор - ради обратной совместимости.
Ну и чуток проблем другого плана - если интересно поищите причины не выхода в свет PHP6, где как раз хотели сделать нативную поддержку многобайтовых кодировок.
dikoobraz пишет:
deprecated гайку mbstring.func_overload - я не понимаю о чем речь. Можете объяснить подробнее
Есть такая настройка в php.ini. В актуальном PHP 7.2 объявлена DEPRECATED, то есть в ближайших релизах запланировано её удаление.
Поэтому если нужна обработка многобайтовых кодировок сложнее чем echo и конкатенация - то используйте mb_* функции
dikoobraz пишет:
но зачем же столько агрессии
Вам показалось, но тем не менее прошу прощения.
Строитель пишет:
после первого внимательного прочтения мануала становится всё понятнее
Эх, я не один раз читал мануал до тех пор пока начало получаться что-то работающее регулярно. А Джеффри Фридл шикарен, прочитать обязательно стоит, регулярки много где используются.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.