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.SU

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


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

> Описание: strlen() + substr()
DarkLan
Отправлено: 15 Августа, 2016 - 20:52:50
Post Id



Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Июль 2016  


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




Добрый вечер.

Есть строка, например: "Привет мир".
Есть задание, урезать его до 6 символом, например:
PHP:
скопировать код в буфер обмена
  1. if (iconv_strlen($row['name']) >= 6) {
  2.         $row['name_cut'] = substr($row['name'], 0, 6);
  3.         $row['name_cut'] = $row['name_cut'] . ' ...';
  4. }

Суть вопроса в кодировке. Как резать так, что бы учитывались не байты, а именно буквы? Давно такое делал, сегодня забил как. Спасибо.

(Отредактировано автором: 15 Августа, 2016 - 20:54:27)

 
 Top
ytrewq123
Отправлено: 15 Августа, 2016 - 21:41:24
Post Id


Посетитель


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


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




mb_strlen();
mb_substr();
И всё будет как надо

(Отредактировано автором: 15 Августа, 2016 - 21:42:22)

 
 Top
DarkLan
Отправлено: 16 Августа, 2016 - 01:32:16
Post Id



Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Июль 2016  


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




ytrewq123 пишет:
mb_strlen();
mb_substr();
И всё будет как надо


Нет, не будет, эти варианты первыми попробовал.

Суть в том, все работает, но з "�" в некоторых окончаниях. Это происходит потому, что символ в кодировке разрывается на 2 части - потому этот знак появляется. Если сделать что-то типа:
PHP:
скопировать код в буфер обмена
  1. $array = array('Привет мир');
  2.         foreach ($array as $value) {
  3.                 echo strlen($value) . ' - ' . iconv_strlen($value) . ' - ' . mb_strlen($value);
  4. }

и все это выдаст 19 - 19 - 19. Но фактически символов =10.

Логично и не верно.

Решения:
Очень часто бывает так, то страницы закодированы в UTF-8 включают в себя символы так званой cp1251 кодировки.
1 решение (Отобразить)

2 решение (Отобразить)


Все спасибо, всем пока Хм .

(Отредактировано автором: 16 Августа, 2016 - 17:20:22)

 
 Top
ytrewq123
Отправлено: 16 Августа, 2016 - 01:57:04
Post Id


Посетитель


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


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




Простите, может я чего-то не понимаю.
Но скопировав этот ваш пример и закинув в файл с кодировкой ЮТФ-8.
19 - 10 – 10
Вроде что и требовалось.
Но может я не понял вашей проблемы.
Не знаю точно как она работает. Но есть такая функция
mb_internal_encoding("utf-8");
может она вам поможет.
Удачи.
 
 Top
esterio
Отправлено: 16 Августа, 2016 - 11:51:43
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




DarkLan пишет:
Решения:
Очень часто бывает так, то страницы закодированы в UTF-8 включают в себя символы так званой cp1251 кодировки.

Ответ неверный. Не надо запутывать участников форума ложной информацией. Вместо этого идем и читаем про ASCII и узнаем что латиница в UTF-8, cp1251 и других имеет одинаковые коды
 
 Top
Мелкий Супермодератор
Отправлено: 16 Августа, 2016 - 12:23:19
Post Id



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


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


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




ytrewq123 пишет:
Не знаю точно как она работает. Но есть такая функция
mb_internal_encoding("utf-8");

Вы совершенно правы.
В функциях mb_ есть необязательный последний параметр для указания используемой кодировки. По-умолчанию используется та кодировка, которая задана ранее с помощью mb_internal_encoding.
Если кодировка ранее задана не была, то используется параметр конфигурации
mbstring.internal_encoding, если такой есть. Начиная с 5.6.0 этот параметр deprecated
С версии 5.6.0 используется default_charset, если только не объявлен mbstring.internal_encoding

Замечу, и это очень важно в контексте вопроса, до 5.6.0 по умолчанию использовалась однобайтовая кодировка ISO-8859-1. При этом, понятное дело, для какой-то входной байтовой последовательности mb_strlen считает, что работает с указанной однобайтовой кодировкой и выдаёт правильный результат именно для этой кодировки. Но неправильный результат для стороннего наблюдателя, знающего, что входной массив байт был в UTF8.

С iconv_strlen ситуация аналогичная, только другие функции и параметры.


-----
PostgreSQL DBA
 
 Top
DarkLan
Отправлено: 16 Августа, 2016 - 17:19:38
Post Id



Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Июль 2016  


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




esterio пишет:
DarkLan пишет:
Решения:
Очень часто бывает так, то страницы закодированы в UTF-8 включают в себя символы так званой cp1251 кодировки.

Ответ неверный. Не надо запутывать участников форума ложной информацией. Вместо этого идем и читаем про ASCII и узнаем что латиница в UTF-8, cp1251 и других имеет одинаковые коды


Возможно, но:
сохраните файл скрипта в UTF-8, включите в него вывод строки "Привет мир", используйте любою из функций без указания кодировки и выведите количество букв в данной строке.

Все ASCII символы в UTF-8 занимают 1 байт остальные от 2 до 6 (реально до 4-х насколько я помню). UTF позволяет использовать любые символы (хоть китайски), а cp-1251 только ASCII, кириллицу и еще 62 всяких.

Мелкий пишет:
...

Так и есть, полный ответ на поставленный вопрос исходя их теории и понимании почему так, а не иначе. Спасибо Подмигивание

(Отредактировано автором: 16 Августа, 2016 - 17:34:41)

 
 Top
Мелкий Супермодератор
Отправлено: 16 Августа, 2016 - 17:39:20
Post Id



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


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


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




CODE (bash):
скопировать код в буфер обмена
  1. melkij@melkij-work:~$ iconv -f utf8 -t utf8 testlen.php #это utf8, согласны?
  2. <?php
  3. $array = array('Привет мир');
  4. foreach ($array as $value) {
  5.   echo strlen($value) . ' - ' . iconv_strlen($value) . ' - ' . mb_strlen($value),PHP_EOL;
  6. }
  7. melkij@melkij-work:~$ php-7.0.8 -n -f testlen.php
  8. 19 - 10 - 10
  9. melkij@melkij-work:~$ php-5.6.22 -n -f testlen.php
  10. 19 - 10 - 10
  11. melkij@melkij-work:~$ php-5.5.37 -n -f testlen.php
  12. 19 - 19 - 19
  13. melkij@melkij-work:~$ php-5.4.45 -n -f testlen.php
  14. 19 - 19 - 19
  15. melkij@melkij-work:~$ php-5.4.45 -n -d mbstring.internal_encoding=utf8 -f testlen.php
  16. 19 - 19 - 10
  17.  

-n, кто не помнит - означает игнорировать любые php.ini
Результаты ожидаемые. Никаких cp1251 здесь нет.


-----
PostgreSQL DBA
 
 Top
esterio
Отправлено: 16 Августа, 2016 - 17:50:30
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




Еще раз повторюсь: это не означает что у вас файл был utf8 и вдруг стал в cp1251. Он и далее в кодировке utf8, а то что считает количество байт как при cp1251 отлично описал Мелкий
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB