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 век, мля. Или я что-то не понимаю?

Комментарии

  1. # DF: 

    «$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»

  2. # [m.k]

    У меня была недавно такая фигня – не отображались блоки у интернет-магазина.
    Создал новый файл, скопировал весь код из старого – заработало. Кодировка у старого та же. ХЗ почему так.

  3. # Тормоз: 

    Немногим лучше, всё равно некрасиво.

  4. # Сандер

    Еще чуть лучше. Мне кажется, она не работает без якобы необязательного параметра «длина».

    $lastLetter = str_replace(‘ь’, ‘’, ‘Рязань’);
    $lastLetter = mb_substr($lastLetter, -1, 1, ‘utf-8’);

  5. # Сандер

    Ааааа… написал и тут понял.
    Если параметра 3, то 3ий параметр воспринимается как длина. Тем самым, если пропустить длину, из-за указания кодировки подается длина «utf-8».

  6. # Alek$

    Самый неочивидный глюк PHP, с которым я имел дело выглядит так:

    $file_basename = basename(‘Русское имя файла из нескольких слов.zip’);

    Хз, почему, но в $file_basename оказивается не «Русское имя файла из нескольких слов.zip», как следовало бы ожидать, а «имя файла из нескольких слов.zip».

    Баг проявляется только в кодировке cp1251.

  7. # Random

    А iconv заюзать?

  8. # MeG

    Сандер – в точку.
    Тормоз просмотрел порядок необязательных параметров в документации, и ввел всех в заблуждение =)

  9. # Тормоз: 

    Сандер, Meg, сперва сами попробуйте так сделать.

    Random, можно заюзать iconv, а это нормально, по-твоему?

  10. # MeG

    Тормоз, ну причем тут попробуйте. попробовал, не работает. посмотри документацию, описание функции
    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 не причем.

  11. # Сандер

    Таки делал. Присланный мной выше код у меня сработал как надо.

  12. # Тормоз: 

    MeG, Сандер, извините, значит, я всё же какую-то ошибку допускал, как обычно. Завтра попробую ваш вариант. Но в любом случае с UTF-8 у PHP дела плохи.

  13. # oleg

    mb_internal_encoding(«UTF-8»);
    $lastLetter = str_replace(‘ь’, ‘’, ‘Рязань’);
    $lastLetter = mb_substr($lastLetter, -1);

  14. # Тормоз: 

    Oleg, две строчки лучше, чем одна :) Конкретно в этом случае, естественно. Но если в коде много раз вызывать функции mb_*, то, конечно, так лучше. Спасибо за напоминание.

  15. # Владимирский

    Тормоз, передал тебе эстафету.

  16. # Тормоз: 

    Владимирский, извини, мне уже надоели эстафеты. Не буду участвовать.

  17. # дядя Фридрих

    А чем Вас не устраивает функция
    string utf8_encode (string data)
    У меня стояла задача закодировать чешские буквы в utf8 сработало без проблем.

  18. # ynkulbyh

    Используешь mb* вот и используй их. А про обычные функции лучшие забыть, это я про str_replace.

    Во вторых, в какой у тебя кодировке файл содержащий код?

    Ну и,

    mb_substr – в документации не нашел ничего про использование отрицательных значений в качестве второго аргумента.

    $lastLetter = mb_substr($lastLetter, mb_strlen($lastLetter, ‘utf-8’) – 1, 1, ‘utf-8’);

    - Прекрасно работает. Учите матчасть )

  19. # Тормоз: 

    Ynkulbyh, функции mb_ str_replace просто не существует. Файл, естественно, в UTF-8.

    Рекомендуешь матчасть учить, а сам не догадался, что описание mb_substr аналогично substr, в котором есть и про отрицательные значения :)

Комментирование этой статьи закрыто.

Интересное Покупки ТехникаРазное Отдых Статьи Строительство Услуги Общество Хобби Культура Советы Уют