За последние 24 часа нас посетили 15458 программистов и 1603 робота. Сейчас ищут 830 программистов ...

strpos и UTF-8

Тема в разделе "PHP для новичков", создана пользователем VLK, 21 июн 2014.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Подскажите, есть текст в кодировке UTF-8, например - 'привет мир', если искать позицию пробела при помощи strpos это будет 12, если при помощи mb_strpos то это будет 6, т.е. в 2 раза меньше.

    вот это значение - в 2 раза меньше, оно постоянно? или есть какие то символы, которые допустим будут занимать не 2 а 3 или более символа в кодировке которую использует strpos?

    почему меня привлекает strpos, а не mb_strpos, потому что в strpos в качество искомого значения я могу указывать как строчку, допустим '.' так и массив т.е. array('.','!','?'.. ), но при этом меня интересует длина.

    подскажите пожалуйста.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Нет, значение не постоянное. utf-8 - кодировка с переменным количеством байтов на символ, поэтому и приходится использовать mb_ - функции. В php 5.4 говорили о какой-то поддержке юникода стандартными функциями, но я так и не разобрался, как это включить (кстати, если кто расскажет, буду благодарен), ну, и поскольку, на серверах все ещё большей частью 5.3, а иногда даже 5.2 попадается, пользуюсь mb-функциями.
     
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Понятно, спасибо, кстати в strpos сейчас присмотрелся, нельзя там array('.','!','?'.. ) в качестве поиска использовать, перепутал с чем то.
    Но все равно вопрос и ответ полезен.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    mkramer, не знаю в каком контексте ты слышал про это. возможно что-то новое придумали, я не в курсе. есть уже давно т.н. перегрузка функций — говеная идея из ряда register_globals и magic_quote

    http://www.php.%6eet/manual/ru/mbstring.overload.php

    Добавлено спустя 3 минуты 46 секунд:
    VLK, strpbrk() посмотри
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    artoodetoo, http://habrahabr.ru/post/136800/.
    Ну и на официальном сайте тоже где-то читал, когда был релиз. Сейчас не могу найти
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да, обещали по-дефолту юникод. ждёмана.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    не состоялось пока — "неверно понятый ченджлог". фактически случился только mb_internal_encoding('UTF-8') по умолчанию.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Я слыхал, что корпоративный сектор на западе предпочитает utf-16. Интересно, насколько то правда.
     
  9. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    !!! косяк найден, забыл поставить у mb_strlen 2-й параметр

    что то я не понимаю, есть такой код:
    Код (PHP):
    1. $str1 = 'ёйцукенгшщзхъфывапролджэячсмитьбю';
    2. echo "<h3>{$str1}</h3>";
    3. echo '<p>strlen: ' . strlen($str1) . '</p>';
    4. echo '<p>mb_strlen: ' . mb_strlen($str1) . '</p>';
    5.  
    6. $str2 = 'ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ';
    7. echo "<h3>{$str2}</h3>";
    8. echo '<p>strlen: ' . strlen($str2) . '</p>';
    9. echo '<p>mb_strlen: ' . mb_strlen($str2) . '</p>';
    10.  
    11.  
    12. $str3 = ':?()-\'.,!"№;';
    13. echo "<h3>{$str3}</h3>";
    14. echo '<p>strlen: ' . strlen($str3) . '</p>';
    15. echo '<p>mb_strlen: ' . mb_strlen($str3) . '</p>';
    16.  
    17.  
    18. $str4 = ' ';
    19. echo "<h3>пробел</h3>";
    20. echo '<p>strlen: ' . strlen($str4) . '</p>';
    21. echo '<p>mb_strlen: ' . mb_strlen($str4) . '</p>';
    22.  
    23.  
    24. $str5 = '1234567890';
    25. echo "<h3>{$str5}</h3>";
    26. echo '<p>strlen: ' . strlen($str5) . '</p>';
    27. echo '<p>mb_strlen: ' . mb_strlen($str5) . '</p>';
    а в результате длина одинаковая что у strlen, что у mb_strlen, в чем может быть прикол?
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    ;
    Код (Text):
    1.  
    2. mb_internal_encoding("utf-8")
    перед кодом, и будет ожидаемо:
    Скрин

    Хотя странно, у меня php 5.5, должно и без этого верно работать
     
  11. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    но как я понимаю:
    Код (PHP):
    ни как не влияет на работу strlen?
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Да. Зато на mb_strlen влияет