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.SU » » Вопросы новичков » Обрезание строки

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

1. DarkLan - 15 Августа, 2016 - 20:52:50 - перейти к сообщению
Добрый вечер.

Есть строка, например: "Привет мир".
Есть задание, урезать его до 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. }

Суть вопроса в кодировке. Как резать так, что бы учитывались не байты, а именно буквы? Давно такое делал, сегодня забил как. Спасибо.
2. ytrewq123 - 15 Августа, 2016 - 21:41:24 - перейти к сообщению
mb_strlen();
mb_substr();
И всё будет как надо
3. DarkLan - 16 Августа, 2016 - 01:32:16 - перейти к сообщению
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 решение (Отобразить)


Все спасибо, всем пока Хм .
4. ytrewq123 - 16 Августа, 2016 - 01:57:04 - перейти к сообщению
Простите, может я чего-то не понимаю.
Но скопировав этот ваш пример и закинув в файл с кодировкой ЮТФ-8.
19 - 10 – 10
Вроде что и требовалось.
Но может я не понял вашей проблемы.
Не знаю точно как она работает. Но есть такая функция
mb_internal_encoding("utf-8");
может она вам поможет.
Удачи.
5. esterio - 16 Августа, 2016 - 11:51:43 - перейти к сообщению
DarkLan пишет:
Решения:
Очень часто бывает так, то страницы закодированы в UTF-8 включают в себя символы так званой cp1251 кодировки.

Ответ неверный. Не надо запутывать участников форума ложной информацией. Вместо этого идем и читаем про ASCII и узнаем что латиница в UTF-8, cp1251 и других имеет одинаковые коды
6. Мелкий - 16 Августа, 2016 - 12:23:19 - перейти к сообщению
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 ситуация аналогичная, только другие функции и параметры.
7. DarkLan - 16 Августа, 2016 - 17:19:38 - перейти к сообщению
esterio пишет:
DarkLan пишет:
Решения:
Очень часто бывает так, то страницы закодированы в UTF-8 включают в себя символы так званой cp1251 кодировки.

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


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

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

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

Так и есть, полный ответ на поставленный вопрос исходя их теории и понимании почему так, а не иначе. Спасибо Подмигивание
8. Мелкий - 16 Августа, 2016 - 17:39:20 - перейти к сообщению
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 здесь нет.
9. esterio - 16 Августа, 2016 - 17:50:30 - перейти к сообщению
Еще раз повторюсь: это не означает что у вас файл был utf8 и вдруг стал в cp1251. Он и далее в кодировке utf8, а то что считает количество байт как при cp1251 отлично описал Мелкий

 

Powered by ExBB FM 1.0 RC1