Духовность™
Продвинутый новичок
ага, спасибо, mb_internal_encoding помог
mb_internal_encoding('UTF-8');
$s = 'вася';
for ($i=0; $i<mb_strlen($s); $i++) echo $s[$i]; // "ва"
for ($i=0; $i<strlen($s); $i++) echo $s[$i]; // "вася"
Можно бы и просто PHP обновить, там кодировка по умолчанию исправлена.см второй параметр у mb_strlen
в каком именно php и как исправлена?Можно бы и просто PHP обновить, там кодировка по умолчанию исправлена.
Нет, UTF8 не стала внутренней кодировкой - это пока вызывает больше проблем (для компилятора и испольняемой среды PHP) чем пользы.Можно бы и просто PHP обновить, там кодировка по умолчанию исправлена.
Поподробнее, пожалуйста. Я знаю всего лишь 1 способ перегрузки функций(замена указателей в таблице).ровно того же можно достичь runkit-ом
5.4: изменили кодировку по умолчанию, и теперь последний параметр mb_* функций не нужен.в каком именно php и как исправлена?
Я где-то говорил про внутренние кодировки? Я сказал, что последнее значение функции имеет вариант по умолчанию(function($var1, $var2=$default) {), который и изменили.Нет, UTF8 не стала внутренней кодировкой - это пока вызывает больше проблем (для компилятора и испольняемой среды PHP) чем пользы.
Он именно это и делает.Поподробнее, пожалуйста. Я знаю всего лишь 1 способ перегрузки функций(замена указателей в таблице).
И всё равно, я не понимаю. Чисто по логике. По восприятию. По мышлению. У меня реально краш мозга происходит.а вот это поведение мне совсем не понятно:
почему не работает с mb_strlen и работает со strlen?PHP:mb_internal_encoding('UTF-8'); $s = 'вася'; for ($i=0; $i<mb_strlen($s); $i++) echo $s[$i]; // "ва" for ($i=0; $i<strlen($s); $i++) echo $s[$i]; // "вася"
точнее мне понятно... но как то я не привык так работать...
$s = 'вася';
for ($i=0; $i<strlen($s); $i++) {
if ($s[$i] == 'а') echo 'буква а найдена в слове!';
}
нет, если к примеру мы знаем что там 100% ascii то нахрена нам mbкороче, правильно ли я понимаю, что для mb проекта всегда нужно использовать mb_* функции?
Жесть...Так. А как поменять данные в таблицах, сделав их UTF?
<<<Сообщения: 4 879
Все очень просто - воспользуйтесь кодом ниже, и поэкспериментируйте: закомментируйте/раскомментируйте mb_internal_encoding и напишите "вася" в utf-8 кодировке, и например, в win-1251 - все сразу станет яснее. Еще большую ясность Вам внесет документация на русском языке по mb_strlen() - там четко написано: "Возвращает количество символов в строке (string) str, имеющих кодировку символов encoding. Многобайтный символ вычисляется как 1."Функция mb_strlen типа сделана для работы с mb строками.
И возвращает "длину строки". В чем? Очевидно, кол-во символов, а не байт, ибо mb_strlen('вася') дает 4, а не 8 как я ожидаю.
Объясните, не пойму. И как теперь посимвольно пройтись по строке, если нужно что-то парсить, типа так:
<?php
mb_internal_encoding('UTF-8');
$s = 'вася';
echo 'mb_internal_encoding: '.mb_internal_encoding().';<br> strlen: '.strlen($s).';<br> mb_strlen: '.mb_strlen($s).'.';
?>
Да, любая нормальная IDE может, мне кажется. По крайней мере NetBeans'ом я пути и имена классов заменял без проблем и довольно шустро.Возможно, кто-то поделится парсером, чтобы заменить все не MB функции во всех скриптах за 1 раз?
Причина в том, как работает оператор [] cо строками. А судя по поведению работает он просто: считывает данные длиной 1 байт и смещением указанным в []. Т.е. он тупо не перегружается для мультибайтовых строк.И всё равно, я не понимаю. Чисто по логике. По восприятию. По мышлению. У меня реально краш мозга происходит.
Функция mb_strlen типа сделана для работы с mb строками.
И возвращает "длину строки". В чем? Очевидно, кол-во символов, а не байт, ибо mb_strlen('вася') дает 4, а не 8 как я ожидаю.
Объясните, не пойму. И как теперь посимвольно пройтись по строке, если нужно что-то парсить, типа так:
PHP:$s = 'вася'; for ($i=0; $i<strlen($s); $i++) { if ($s[$i] == 'а') echo 'буква а найдена в слове!'; }
Просто.И как теперь посимвольно пройтись по строке
$s = 'вася';
for ($i=0; $i<strlen($s); $i+=2) {
if ($s[$i] . $s[$i+1] == 'а') echo 'буква а найдена в слове!';
}
Вот установил себе Netbeans - рефакторинг, конечно, рулитДа, любая нормальная IDE может, мне кажется. По крайней мере NetBeans'ом я пути и имена классов заменял без проблем и довольно шустро.