Покинул форум
Сообщений всего: 22
Дата рег-ции: Июль 2016
Помог: 0 раз(а)
ytrewq123 пишет:
mb_strlen();
mb_substr();
И всё будет как надо
Нет, не будет, эти варианты первыми попробовал.
Суть в том, все работает, но з "�" в некоторых окончаниях. Это происходит потому, что символ в кодировке разрывается на 2 части - потому этот знак появляется. Если сделать что-то типа:
перевести файл скрипта в нужную кодировку, например в cp1251 - тогда функции strlen($value) и iconv_strlen($value) и mb_strlen($value) вернут верное количество символов.
бывает так, что мы не может перекодировать файл скрипта в другую кодировку, она у нас изначально UTF-8 и изменять не можно. В этом случаем нам помогут: iconv_strlen($value, 'UTF-8') или mb_strlen($value, 'UTF-8').
Покинул форум
Сообщений всего: 352
Дата рег-ции: Окт. 2014
Помог: 0 раз(а)
Простите, может я чего-то не понимаю.
Но скопировав этот ваш пример и закинув в файл с кодировкой ЮТФ-8.
19 - 10 – 10
Вроде что и требовалось.
Но может я не понял вашей проблемы.
Не знаю точно как она работает. Но есть такая функция
mb_internal_encoding("utf-8");
может она вам поможет.
Удачи.
esterio
Отправлено: 16 Августа, 2016 - 11:51:43
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
DarkLan пишет:
Решения:
Очень часто бывает так, то страницы закодированы в UTF-8 включают в себя символы так званой cp1251 кодировки.
Ответ неверный. Не надо запутывать участников форума ложной информацией. Вместо этого идем и читаем про ASCII и узнаем что латиница в UTF-8, cp1251 и других имеет одинаковые коды
Мелкий
Отправлено: 16 Августа, 2016 - 12:23:19
Активный участник
Покинул форум
Сообщений всего: 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
DarkLan
Отправлено: 16 Августа, 2016 - 17:19:38
Новичок
Покинул форум
Сообщений всего: 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 всяких.
Мелкий пишет:
...
Так и есть, полный ответ на поставленный вопрос исходя их теории и понимании почему так, а не иначе. Спасибо
-n, кто не помнит - означает игнорировать любые php.ini
Результаты ожидаемые. Никаких cp1251 здесь нет.
----- PostgreSQL DBA
esterio
Отправлено: 16 Августа, 2016 - 17:50:30
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
Еще раз повторюсь: это не означает что у вас файл был utf8 и вдруг стал в cp1251. Он и далее в кодировке utf8, а то что считает количество байт как при cp1251 отлично описал Мелкий
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.