За последние 24 часа нас посетили 18133 программиста и 1599 роботов. Сейчас ищут 967 программистов ...

Проблема то ли с кодировкой то ли не знаю с чем (Help!)

Тема в разделе "PHP для новичков", создана пользователем Taktreba, 29 янв 2017.

  1. Taktreba

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

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    PHP:
    1. /* < Задание 8>
    2. Создайте переменную $text и присвойте ей значение 'Мама мыла раму!'. Выведите символы: ы, м, а, у, ! всеми возможными способами. */
    PHP:
    1. $text = 'Мама мыла раму!';
    2. $xa = $text[6];
    3. $xb = $text[0];
    4. $xc = $text[1];
    5. $xd = $text[13];
    6. $xe = $text[4];
    7.  
    8. echo $xa. '<br>';
    9. echo $xb. '<br>';
    10. echo $xc. '<br>';
    11. echo $xd. '<br>';
    12. echo $xe. '<br>';// Это решение выводит ромбик с знаком вопроса, проблема с кодировкой не могу решить не как. Латинские символы выводит нормально, кириллицу нет ((
    13.  
    14.  
    15. $str = 'This is a test.';
    16. $ya = $str[0];
    17. $yb = $str[1];
    18. $yc = $str[2];
    19. $yd = $str[3];
    20. $ye = $str[5];
    21. echo $ya. '<br>';
    22. echo $yb. '<br>';
    23. echo $yc. '<br>';
    24. echo $yd. '<br>';
    25. echo $ye. '<br>'; // Пример из манула рнр работает нормально
    26.  
    27. //Не знаю что делать нужна подсказка что делать с кодировкой. На OpenServer стоит apache 2.4-x64   php 5.6 -x64 MySQL 5.6 - x64 кодировка Note++ UTF-8 без BOM
    Собственно в комментариях все сказано, помогите пожалуйста
    Ниже выдержка их РНР мануала, мне не о чем не говрит так как я чайник, только пожалуйста поделу
    "Внимание

    Строки в PHP внутренне представляют из себя массивы байт. Как результат, доступ или изменение строки по смещению небезопасно с точки зрения многобайтной кодировки, и должно выполняться только со строками в однобайтных кодировках, таких как, например, ISO-8859-1."
     
    #1 Taktreba, 29 янв 2017
    Последнее редактирование модератором: 29 янв 2017
  2. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Уже ночь,на ум только приходит след.способ)

    PHP:
    1. $text = 'Мама мыла раму!';
    2. $xa = mb_substr($text,6,1);
    3. echo $xa. '<br>';
     
  3. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    всё верно. Главное чтобы ТС понял почему это происходит именно так.

    Код (PHP):
    1. <?php
    2.  
    3. $text = 'Мама мыла раму!';
    4.  
    5. $strLen = mb_strlen($text);
    6.  
    7. for ($i = 0; $i < $strLen; $i++)
    8. {
    9.     $arr[] = mb_substr($text, $i, 1);
    10. }
    11.  
    12. print_r($arr);
    А именно из-за того, что строка в многобайтовой кодировке, а обращаясь к элементам массива так как вы указали, вы пытаетесь вывести лишь часть символа.
     
    alexblack нравится это.
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в старые добрые времена жили были старик со старухой и был и них пропретарный комп вместе с офисом. и был он несовместим ни с чем другим, потому что был не офис а дерьмо текстовое. И вот тогда битов в байтах всем хватало выше крыши, даже когда они были семибитными.

    Взяли значит буквы английские, большие да маленькие, потом всякие важные знаки да невидимые энтеры и запихали в набор длинною в 127 символов. Назвали ASCII.

    Потом, решили, что семь бит это чушь, и семь не степень двойки и не четное число и короче добили до восьми бит в байте как стандарт.

    Шло время, и все биты в байтах потратились на английские буквы (с 1 по 127) и всякую хрень (с 128 по 255) типа уголков, точечек, умляутов и прочей мути, которую назвали ANSI:

    [​IMG]

    И вот одним днём люди настолько зажрались, что им стало мало умляутов, и угоков и прочей мути. Возжелали люди писать на родном языке своей страны, а не только на чистом английском. И стали значит заменять закорючки да умляуты на свои родные буквы.

    Получается так:
    [​IMG]

    часть закорючек теберь в каждой стране своими символами заменена. И никогда не знаешь, как она будет показываться у другого потому, что каждый комп рисует эти байты сообразно своим национальным идеям:

    [​IMG]

    Эти наборы стали именовать кодовыми страницами. А в народе проще - кодировками.

    Ага. Так вот когда это дело всех в конец уже достало, то решили, что не надо мучать жопу и надо перестать пытаться запихать больше информации в байт, чем в нём есть бит.

    Поэтому в обиход вошли кодировки, где символ кодируется не одним байтом, а несколькими.

    UTF-8 не восьмая, не восьмибитная и не восьмибайтная кодировка. Она начинается с одного байта в восемь бит ширшиной. Её первые 127 символов полностью взяты из ASCII, но в байте 8 бит, и главный самый получается всегда ноль, потому что для записи 127 символов достаточно 7 бит. А восьмой не нужен. Поэтому восьмой бит в UTF он сигнальный. Он говорит, что за байтом с этим битом, если он не ноль, идёт второй байт, и это всё один символ. А во втором байте снова так же - 127 значений + бит. Если этот бит единичка, то значит, что дальше идёт байт, который всё ещё является продолжением текущего символа. Т.е. по факту там может быть целый поезд.

    UTF-8 кодировка перменной длинны. Если запишешь свою фразу на английском, то твой алгоритм будет работать. А сейчас пока ещё в PHP это $text[13]; всё еще способ доступа к отдельным байтам строки. Хотя уже давно идут разговоры за переход на UTF-8 нативно и прозрачно, но воз и ныне там.
     
    denis01 нравится это.
  5. Taktreba

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

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    Как то сложно выводить одну лишь буковку ( а задание все таки есть. и как его сделать я не понял. Странно что на курсах дают такое задание хотя заведомо его нельзя правильно решить в кириллице.
    Из это задания следует следующее, которое Вашим способом я не понимаю как сделать, возможно есть еще варианты?

    "Создайте переменную $game и присвойте ей значение 'Путешественник'. Обращаясь с этим словом как с отдельными символами составьте различные русские слова." - подскажите решение этой задачки, с учетом того что у меня проблема с кодировкой
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    всему миру насрать на твою кириллицу :D как было в книжке - так и перевели. переводчику особенно насрать - он не знает твоего этого пхп и программирования.

    по факту ты не загуглил и пропустил два решения сверху. ты должен был уже загуглить ту функцию, которую не знаешь. это плохо так пропускать. ты должен гуглить всё что встречаешь впервые.
     
    Zuldek и Taktreba нравится это.
  7. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Taktreba если скрипт выполняется на сервере то установи кодировку ютф8 без бомсигнатуры и пошли html заголовок с явным указанием кодировки (для ие) если скрипт выполняется в консоли(винды) то установи кодировку скрипта ое866 так же в консоли перейди на нужную кодовую страницу
    так же можно самому пыху явно установить внутреннюю кодировку
     
  8. Taktreba

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

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    я в open server все делаю... в файле index.php мне в <head> прописать мету UTF-8?
     
  9. machetero

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

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Кодировку в первую очередь через в пхп надо указывать так header('Content-Type: text/html; charset=utf-8'); а потом уже можно мету писать. Потому что если браузер выбрал неверную кодировку, мету он не сможет прочитать
     
  10. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Боже, что выделаете? Вы что думаете, что скрипт тса не выведет "символы вопроса", если прописать header('Content-Type: text/html; charset=utf-8'); первой строкой кода? Так, вот - вывод никак не изменится и измениться не может. Каким образом это к сути вопроса относиться? Не запутывайте человека если нет твёрдого понимания причины возникновения у него проблемы.

    Тс, оба решения вызывают функции указывающие на решение проблемы (не говоря уже о текстовых пояснениях которые были даны исчерпывающие). Поэтому вашим действием должно стать прочтение описания этих функций на ресурсе php.net. Сложности решения нет ни в первой ни во второй реализации, вторая даже не такая избыточная как ваша (решение из учебника), поскольку не инициализирует десяток переменных для хранения в каждой из них по "букве", а использует массив.
     
    #10 Zuldek, 29 янв 2017
    Последнее редактирование: 29 янв 2017
    denis01, alexblack и mahmuzar нравится это.
  11. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Taktreba @Zuldek всё же полагаю проблема с кодировкой, точнее с согласованостью кодировок браузера и выдаваемой страницы:
    PHP:
    1. $text = 'Мама мыла раму!';
    2. $xe = $text[4];
    3. echo $xe. '<br>';
    xe равно пробелу те должен в отличии от кирилицы вывестись норм.

    энд кодировка также по умолчанию устанавливается в файле .htaccess
     
    #11 abrdabr, 30 янв 2017
    Последнее редактирование модератором: 30 янв 2017