PHP и UTF-8
22.05.2009 технологии
$lastLetter = str_replace('ь', '', 'Рязань');
$lastLetter_count = mb_strlen($lastLetter, 'utf-8');
$start = ($lastLetter_count - 1);
$lastLetter = mb_substr($lastLetter, $start, 1, 'utf-8');
Очень глупый код, правда? Казалось бы, надо так:
$lastLetter = str_replace('ь', '', 'Рязань');
$lastLetter = mb_substr($lastLetter, -1, 'utf-8');
Но, не работает, сцуко. И вот подобные проблемы в PHP возникают постоянно, убивая время. Что-ж такое творится? 21 век, мля. Или я что-то не понимаю?
Комментарии
Комментирование этой статьи закрыто.
« Как устроены Города 2.0? PHP-класс для работы с Google Maps API »
«$start = ($lastLetter_count – 1);» – лишняя фигня.
$lastLetter = str_replace(‘ь’, ‘’, ‘Рязань’);
$lastLetter = mb_substr($lastLetter, mb_strlen($lastLetter,‘utf-8’)-1, 1, ‘utf-8’);
А вообще, http://www.php.net/~scoates/unicode/render_func_data.php – «PHP 6 – Unicode Completion Stats»
У меня была недавно такая фигня – не отображались блоки у интернет-магазина.
Создал новый файл, скопировал весь код из старого – заработало. Кодировка у старого та же. ХЗ почему так.
Немногим лучше, всё равно некрасиво.
Еще чуть лучше. Мне кажется, она не работает без якобы необязательного параметра «длина».
$lastLetter = str_replace(‘ь’, ‘’, ‘Рязань’);
$lastLetter = mb_substr($lastLetter, -1, 1, ‘utf-8’);
Ааааа… написал и тут понял.
Если параметра 3, то 3ий параметр воспринимается как длина. Тем самым, если пропустить длину, из-за указания кодировки подается длина «utf-8».
Самый неочивидный глюк PHP, с которым я имел дело выглядит так:
$file_basename = basename(‘Русское имя файла из нескольких слов.zip’);
Хз, почему, но в $file_basename оказивается не «Русское имя файла из нескольких слов.zip», как следовало бы ожидать, а «имя файла из нескольких слов.zip».
Баг проявляется только в кодировке cp1251.
А iconv заюзать?
Сандер – в точку.
Тормоз просмотрел порядок необязательных параметров в документации, и ввел всех в заблуждение =)
Сандер, Meg, сперва сами попробуйте так сделать.
Random, можно заюзать iconv, а это нормально, по-твоему?
Тормоз, ну причем тут попробуйте. попробовал, не работает. посмотри документацию, описание функции
string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )
а не
string mb_substr ( string $str , int $start [, int $length ] [, string $encoding ] )
как говорится, почувствуйте разницу
другое дело, что в функции просто берется третий параметр (если он есть), приводится к long, и используется в качестве длины, и не проверяется, что там может быть не совсем число (это я в исходниках mbstring посмотрел). тут конечно код кривоват, спору нет. так что utf-8 не причем.
Таки делал. Присланный мной выше код у меня сработал как надо.
MeG, Сандер, извините, значит, я всё же какую-то ошибку допускал, как обычно. Завтра попробую ваш вариант. Но в любом случае с UTF-8 у PHP дела плохи.
mb_internal_encoding(«UTF-8»);
$lastLetter = str_replace(‘ь’, ‘’, ‘Рязань’);
$lastLetter = mb_substr($lastLetter, -1);
Oleg, две строчки лучше, чем одна :) Конкретно в этом случае, естественно. Но если в коде много раз вызывать функции mb_*, то, конечно, так лучше. Спасибо за напоминание.
Тормоз, передал тебе эстафету.
Владимирский, извини, мне уже надоели эстафеты. Не буду участвовать.
А чем Вас не устраивает функция
string utf8_encode (string data)
У меня стояла задача закодировать чешские буквы в utf8 сработало без проблем.
Используешь mb* вот и используй их. А про обычные функции лучшие забыть, это я про str_replace.
Во вторых, в какой у тебя кодировке файл содержащий код?
Ну и,
mb_substr – в документации не нашел ничего про использование отрицательных значений в качестве второго аргумента.
$lastLetter = mb_substr($lastLetter, mb_strlen($lastLetter, ‘utf-8’) – 1, 1, ‘utf-8’);
- Прекрасно работает. Учите матчасть )
Ynkulbyh, функции mb_ str_replace просто не существует. Файл, естественно, в UTF-8.
Рекомендуешь матчасть учить, а сам не догадался, что описание mb_substr аналогично substr, в котором есть и про отрицательные значения :)