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
Форумы портала PHP.SU :: Версия для печати :: Работа со строками PHP-7 (кириллица) utf-8
Форумы портала PHP.SU » » Вопросы новичков » Работа со строками PHP-7 (кириллица) utf-8

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

1. dikoobraz - 21 Апреля, 2018 - 22:28:45 - перейти к сообщению
Всем привет! Я только начал изучать 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....
2. Raziel - 21 Апреля, 2018 - 22:49:04 - перейти к сообщению
mbstring подключили?
3. Мелкий - 21 Апреля, 2018 - 22:49:18 - перейти к сообщению
$word[0] - обращение побайтовое, о чем есть предупреждение в мануале.
strlen, как и большинство старых строковых функций - аналогично работают с байтами, а не символами. И об этом варнинги тоже были понаписаны.

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

От настроек окружения не зависит. Разве только упомянуть уже deprecated гайку mbstring.func_overload
4. dikoobraz - 21 Апреля, 2018 - 23:11:02 - перейти к сообщению
Raziel пишет:
mbstring подключили?

Нет не подключал, подскажите пожалуйста как это сделать?
Это проблема только PHP-7?
5. Строитель - 21 Апреля, 2018 - 23:14:18 - перейти к сообщению
dikoobraz, для кириллицы нужно как-то так:

PHP:
скопировать код в буфер обмена
  1. $word = "Слово";
  2.  
  3. $word = preg_split('~~u', $word, -1, PREG_SPLIT_NO_EMPTY);
  4.  
  5. echo $word[0]; // С
6. dikoobraz - 21 Апреля, 2018 - 23:14:54 - перейти к сообщению
Мелкий пишет:
$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);
7. Строитель - 21 Апреля, 2018 - 23:22:50 - перейти к сообщению
dikoobraz пишет:
а что делать с примером посложнее
Транслит обычно пишут на основе поиска с заменой.

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

Передаёте оба эти массива к примеру в str_replace(), ну и третьим параметром передаёте обрабатываемую строку.
(Добавление)
dikoobraz, а конкретно с вашим примером можно просто записать так:
Спойлер (Отобразить)
8. Raziel - 21 Апреля, 2018 - 23:26:36 - перейти к сообщению
Это проблема PHP с самого его рождения
php.ini mbstring.func_overload в 2, функции заменятся аналогами из mbstring
либо если не хотите чтобы замена была везде автоматической, используйте аналоги из mbstring вручную, например вместо strlen() mb_strlen(), в unix само расширение должно быть по дефолту подключено
9. dikoobraz - 21 Апреля, 2018 - 23:30:54 - перейти к сообщению
Я очень хочу, что бы замена была автоматической....
Подскажите как настроить такую автоматическую замену... и будет ли она работать на хосте у провайдера... тоже вопрос....
10. Raziel - 21 Апреля, 2018 - 23:33:44 - перейти к сообщению
Если хостинг VPS/VDS то должен быть доступ к php.ini там замените
;mbstring.func_overload = 0 на
mbstring.func_overload = 2
Если нет используйте функции этого модуля вместо стандартных
http://php.net/manual/ru/ref.mbstring.php
Здесь их список
11. dikoobraz - 21 Апреля, 2018 - 23:37:22 - перейти к сообщению
Строитель Спасибо за функцию strtr().... не знал Радость
(Добавление)
Raziel Спасибо, сейчас буду пробовать настроить
12. Строитель - 21 Апреля, 2018 - 23:40:58 - перейти к сообщению
dikoobraz пишет:
Спасибо за функцию strtr().... не знал
Если очень хочется манипулировать подстроками (символами в строках), то нужно смотреть в сторону регулярных выражений.
13. dikoobraz - 21 Апреля, 2018 - 23:42:34 - перейти к сообщению
С регулярками у меня плохи дела... Огорчение пока
14. Строитель - 21 Апреля, 2018 - 23:48:13 - перейти к сообщению
dikoobraz пишет:
С регулярками у меня плохи дела...
Это так вначале только кажется - после первого внимательного прочтения мануала становится всё понятнее. А ещё есть хорошая книга "Регулярные выражения" Джеффри Фридла.
15. Мелкий - 22 Апреля, 2018 - 00:14:10 - перейти к сообщению
dikoobraz пишет:
По-моему в PHP-5.6 таких проблем не наблюдалось

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

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

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

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

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

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

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

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

 

Powered by ExBB FM 1.0 RC1