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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Описание: Ошибка при работе с кириллическими строками в кодировке utf-8
dikoobraz
Отправлено: 21 Апреля, 2018 - 22:28:45
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Всем привет! Я только начал изучать PHP. Установил локально, у себя на машине (ubuntu 16.04) LAMP - Apache2, PHP-7, mysql, phpmyadmin. Все вроде работает, кириллица отображается правильно.... HO! Я уже второй день бьюсь с такой проблемой....

CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. $word = "слово";
  3. echo $word[0];
  4. echo $word;
  5.  


На выходе получаю следующий результат..

...�
...слово

Соответственно 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....

(Отредактировано автором: 21 Апреля, 2018 - 22:29:44)

 
 Top
Raziel
Отправлено: 21 Апреля, 2018 - 22:49:04
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




mbstring подключили?
 
 Top
Мелкий Супермодератор
Отправлено: 21 Апреля, 2018 - 22:49:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




$word[0] - обращение побайтовое, о чем есть предупреждение в мануале.
strlen, как и большинство старых строковых функций - аналогично работают с байтами, а не символами. И об этом варнинги тоже были понаписаны.

Для работы с мультибайтовыми кодировками есть функции mb_ http://php.net/manual/en/book.mbstring.php

От настроек окружения не зависит. Разве только упомянуть уже deprecated гайку mbstring.func_overload


-----
PostgreSQL DBA
 
 Top
dikoobraz
Отправлено: 21 Апреля, 2018 - 23:11:02
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Raziel пишет:
mbstring подключили?

Нет не подключал, подскажите пожалуйста как это сделать?
Это проблема только PHP-7?
 
 Top
Строитель Модератор
Отправлено: 21 Апреля, 2018 - 23:14:18
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




dikoobraz, для кириллицы нужно как-то так:

PHP:
скопировать код в буфер обмена
  1. $word = "Слово";
  2.  
  3. $word = preg_split('~~u', $word, -1, PREG_SPLIT_NO_EMPTY);
  4.  
  5. echo $word[0]; // С
 
 Top
dikoobraz
Отправлено: 21 Апреля, 2018 - 23:14:54
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Мелкий пишет:
$word[0] - обращение побайтовое, о чем есть предупреждение в мануале.
strlen, как и большинство старых строковых функций - аналогично работают с байтами, а не символами. И об этом варнинги тоже были понаписаны.

Для работы с мультибайтовыми кодировками есть функции mb_ http://php.net/manual/en/book.mbstring.php

От настроек окружения не зависит. Разве только упомянуть уже deprecated гайку mbstring.func_overload


Спасибо за ответ... но зачем же столько агрессии, я ведь только учусь...
deprecated гайку mbstring.func_overload - я не понимаю о чем речь. Можете объяснить подробнее
По-моему в PHP-5.6 таких проблем не наблюдалось
(Добавление)
Строитель пишет:
dikoobraz, для кириллицы нужно как-то так:

PHP:
скопировать код в буфер обмена
  1. $word = "Слово";
  2.  
  3. $word = preg_split('~~u', $word, -1, PREG_SPLIT_NO_EMPTY);
  4.  
  5. echo $word[0]; // С


Хорошо, а что делать с примером посложнее...

CODE (htmlphp):
скопировать код в буфер обмена
  1. function trans($string){
  2.   $alfavit = array('а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd',
  3.                     'е' => 'e', 'ж' => 'g', 'з' => 'z', 'и' => 'i', 'й' => 'y',
  4.                      'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
  5.                      'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u',
  6.                      'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh',
  7.                      'щ' => 'sc', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', ' ' => ' ');
  8.  
  9.   $output = '';
  10.   for($i = 0; $i < strlen($string); $i++){
  11.    $output .= $alfavit[$string[$i]];
  12.  }
  13.  return $output;
  14. }
  15.  
  16. $str = "слово";
  17. echo trans($str);
 
 Top
Строитель Модератор
Отправлено: 21 Апреля, 2018 - 23:22:50
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




dikoobraz пишет:
а что делать с примером посложнее
Транслит обычно пишут на основе поиска с заменой.

Т.е., берёте два массива, в первом массиве у вас русский алфавит, во втором - аналог русского алфавита но англ.буквами (латиница, проще говоря).

Передаёте оба эти массива к примеру в str_replace(), ну и третьим параметром передаёте обрабатываемую строку.
(Добавление)
dikoobraz, а конкретно с вашим примером можно просто записать так:
Спойлер (Отобразить)
 
 Top
Raziel
Отправлено: 21 Апреля, 2018 - 23:26:36
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Это проблема PHP с самого его рождения
php.ini mbstring.func_overload в 2, функции заменятся аналогами из mbstring
либо если не хотите чтобы замена была везде автоматической, используйте аналоги из mbstring вручную, например вместо strlen() mb_strlen(), в unix само расширение должно быть по дефолту подключено
 
 Top
dikoobraz
Отправлено: 21 Апреля, 2018 - 23:30:54
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Я очень хочу, что бы замена была автоматической....
Подскажите как настроить такую автоматическую замену... и будет ли она работать на хосте у провайдера... тоже вопрос....
 
 Top
Raziel
Отправлено: 21 Апреля, 2018 - 23:33:44
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Если хостинг VPS/VDS то должен быть доступ к php.ini там замените
;mbstring.func_overload = 0 на
mbstring.func_overload = 2
Если нет используйте функции этого модуля вместо стандартных
http://php.net/manual/ru/ref.mbstring.php
Здесь их список
 
 Top
dikoobraz
Отправлено: 21 Апреля, 2018 - 23:37:22
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Строитель Спасибо за функцию strtr().... не знал Радость
(Добавление)
Raziel Спасибо, сейчас буду пробовать настроить
 
 Top
Строитель Модератор
Отправлено: 21 Апреля, 2018 - 23:40:58
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




dikoobraz пишет:
Спасибо за функцию strtr().... не знал
Если очень хочется манипулировать подстроками (символами в строках), то нужно смотреть в сторону регулярных выражений.
 
 Top
dikoobraz
Отправлено: 21 Апреля, 2018 - 23:42:34
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




С регулярками у меня плохи дела... Огорчение пока

(Отредактировано автором: 21 Апреля, 2018 - 23:42:56)

 
 Top
Строитель Модератор
Отправлено: 21 Апреля, 2018 - 23:48:13
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




dikoobraz пишет:
С регулярками у меня плохи дела...
Это так вначале только кажется - после первого внимательного прочтения мануала становится всё понятнее. А ещё есть хорошая книга "Регулярные выражения" Джеффри Фридла.
 
 Top
Мелкий Супермодератор
Отправлено: 22 Апреля, 2018 - 00:14:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




dikoobraz пишет:
По-моему в PHP-5.6 таких проблем не наблюдалось

Наблюдались, наблюдались. И в PHP4 тоже, и раньше (хотя PHP3 я не собирал даже из интереса). И в основном именно поэтому поведение и функций и обращения к строке как к массиву байт сохраняется до сих пор - ради обратной совместимости.

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

dikoobraz пишет:
deprecated гайку mbstring.func_overload - я не понимаю о чем речь. Можете объяснить подробнее

Есть такая настройка в php.ini. В актуальном PHP 7.2 объявлена DEPRECATED, то есть в ближайших релизах запланировано её удаление.
Поэтому если нужна обработка многобайтовых кодировок сложнее чем echo и конкатенация - то используйте mb_* функции

dikoobraz пишет:
но зачем же столько агрессии

Вам показалось, но тем не менее прошу прощения.

Строитель пишет:
после первого внимательного прочтения мануала становится всё понятнее

Эх, я не один раз читал мануал до тех пор пока начало получаться что-то работающее регулярно. А Джеффри Фридл шикарен, прочитать обязательно стоит, регулярки много где используются.


-----
PostgreSQL DBA
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB