За последние 24 часа нас посетили 48336 программистов и 1729 роботов. Сейчас ищут 684 программиста ...

Кодировка ..., как???

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

  1. bogong

    bogong Активный пользователь

    С нами с:
    20 май 2010
    Сообщения:
    114
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Ситуация: разминаюсь в написании скриптов, задача стояла так написать аналог strlen-а только не используя его самого ...
    Есть код:
    Код (Text):
    1.  
    2.        function MyStrLen($string){
    3.         $string_array=str_split($string);
    4.         $count=0;
    5.         foreach ($string_array as $n){
    6.             echo $n."<br>";
    7.             $count++;
    8.         }  
    9.         echo "\t\t\tВ строке: <b>".$string."</b> содержится <b>".$count."</b> символов.\n";
    10.     }
    11.    
    12.     MyStrLen("vasya pupkin");
    13.     MyStrLen("vyzyzyzyzyzyzyzyz");
    Все работает, но!!! Как всегда но!!! Если пишу в $string по русски то он выдает белиберду, а по англицки все в порядке ... Мозгом понимаю что это связано с кодировкой.

    Вопрос ..., как сделать так чтоб и по русски он считал правильно количество символов ...
    На вопрос почему не использовать просто strlen предложу прочитать все сообщение с начала, и обратить на слова о том что разминаюсь в алгоритмике.
     
  2. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    а что за белиберду? если один символ, например, ц ввести, что выдаст?
     
  3. bogong

    bogong Активный пользователь

    С нами с:
    20 май 2010
    Сообщения:
    114
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    При внесении "Ц" - 2 символа вместо 1
    При внесении "Вася Пупкин" вместо "vasya pupkin" - 21 вместо 12 ...

    Мне это напомнило набор СМС в телефоне ..., при наборе в транслитерации латиницей разрешенное количество символов больше нежели при наборе в русском ...
     
  4. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    вот только можно было использовать count() вместо foreach.
    а можно было использовать preg_match вообще.

    а не правильно, видимо это ровно в 2 раза больше чем символов? потому что каждый русский симвл в кодировке utf-8 занимает 2 байта. А функция разбивает по 1. можете указать вторым параметром 2 - тогда английские по 2 станут)
     
  5. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    PHP:
    1. $string_array=mb_split('.', $string);
     
  6. bogong

    bogong Активный пользователь

    С нами с:
    20 май 2010
    Сообщения:
    114
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Код (Text):
    1. $string_array=mb_split('.', $string);
    - результат такой же ... Это связано с кодировкой ..., нужно разобраться с кодировкой символов ... Но как не знаю ... Как сделать так чтоб он сплитил в нужной мне кодировке???
     
  7. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    а какая кодировка тебе нужная?)
     
  8. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    PHP:
    1.  
    2. function MyStrLen($string){
    3.     $string_array = mb_split('.', $string);
    4.     $count = count($string_array);
    5.     echo "\t\t\tВ строке: <b>".$string."</b> содержится <b>".$count."</b> символов.\n";
    6. }
    7.    
    8. MyStrLen("vasya pupkin");
    9. MyStrLen("екыпцфв ау");
    HTML:
    1. В строке: vasya pupkin содержится 13 символов.
    2. В строке: екыпцфв ау содержится 11 символов.
    хех, на 1 больше :)
     
  9. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    Тогда вот так
    PHP:
    1. function MyStrLen($string){
    2.     $count = preg_match_all('/./u', $string, $match);
    3.     echo "\t\t\tВ строке: <b>".$string."</b> содержится <b>".$count."</b> символов.\n";
    4. }
    5.    
    6. MyStrLen("vasya pupkin");
    7. MyStrLen("екыпцфв ау");
    и без u - если не в utf-8
     
  10. bogong

    bogong Активный пользователь

    С нами с:
    20 май 2010
    Сообщения:
    114
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    А как сделать так чтоб определять кодировку????
     
  11. Easy

    Easy Активный пользователь

    С нами с:
    15 июл 2011
    Сообщения:
    286
    Симпатии:
    0
    Ну так вы пишите скрипт, он же у вас сохранён в какой то кодировке, вот и посмотрите. В любом случае если весь сайт написан в UTF то при передачи в него случайно cp1251 вы должны будите перекодировать этот текст в нужную кодировку, и так же на оборот.