PHP: /* < Задание 8> Создайте переменную $text и присвойте ей значение 'Мама мыла раму!'. Выведите символы: ы, м, а, у, ! всеми возможными способами. */ PHP: $text = 'Мама мыла раму!'; $xa = $text[6]; $xb = $text[0]; $xc = $text[1]; $xd = $text[13]; $xe = $text[4]; echo $xa. '<br>'; echo $xb. '<br>'; echo $xc. '<br>'; echo $xd. '<br>'; echo $xe. '<br>';// Это решение выводит ромбик с знаком вопроса, проблема с кодировкой не могу решить не как. Латинские символы выводит нормально, кириллицу нет (( $str = 'This is a test.'; $ya = $str[0]; $yb = $str[1]; $yc = $str[2]; $yd = $str[3]; $ye = $str[5]; echo $ya. '<br>'; echo $yb. '<br>'; echo $yc. '<br>'; echo $yd. '<br>'; echo $ye. '<br>'; // Пример из манула рнр работает нормально //Не знаю что делать нужна подсказка что делать с кодировкой. На OpenServer стоит apache 2.4-x64 php 5.6 -x64 MySQL 5.6 - x64 кодировка Note++ UTF-8 без BOM Собственно в комментариях все сказано, помогите пожалуйста Ниже выдержка их РНР мануала, мне не о чем не говрит так как я чайник, только пожалуйста поделу "Внимание Строки в PHP внутренне представляют из себя массивы байт. Как результат, доступ или изменение строки по смещению небезопасно с точки зрения многобайтной кодировки, и должно выполняться только со строками в однобайтных кодировках, таких как, например, ISO-8859-1."
Уже ночь,на ум только приходит след.способ) PHP: $text = 'Мама мыла раму!'; $xa = mb_substr($text,6,1); echo $xa. '<br>';
всё верно. Главное чтобы ТС понял почему это происходит именно так. Код (PHP): <?php $text = 'Мама мыла раму!'; $strLen = mb_strlen($text); for ($i = 0; $i < $strLen; $i++) { $arr[] = mb_substr($text, $i, 1); } print_r($arr); А именно из-за того, что строка в многобайтовой кодировке, а обращаясь к элементам массива так как вы указали, вы пытаетесь вывести лишь часть символа.
в старые добрые времена жили были старик со старухой и был и них пропретарный комп вместе с офисом. и был он несовместим ни с чем другим, потому что был не офис а дерьмо текстовое. И вот тогда битов в байтах всем хватало выше крыши, даже когда они были семибитными. Взяли значит буквы английские, большие да маленькие, потом всякие важные знаки да невидимые энтеры и запихали в набор длинною в 127 символов. Назвали ASCII. Потом, решили, что семь бит это чушь, и семь не степень двойки и не четное число и короче добили до восьми бит в байте как стандарт. Шло время, и все биты в байтах потратились на английские буквы (с 1 по 127) и всякую хрень (с 128 по 255) типа уголков, точечек, умляутов и прочей мути, которую назвали ANSI: И вот одним днём люди настолько зажрались, что им стало мало умляутов, и угоков и прочей мути. Возжелали люди писать на родном языке своей страны, а не только на чистом английском. И стали значит заменять закорючки да умляуты на свои родные буквы. Получается так: часть закорючек теберь в каждой стране своими символами заменена. И никогда не знаешь, как она будет показываться у другого потому, что каждый комп рисует эти байты сообразно своим национальным идеям: Эти наборы стали именовать кодовыми страницами. А в народе проще - кодировками. Ага. Так вот когда это дело всех в конец уже достало, то решили, что не надо мучать жопу и надо перестать пытаться запихать больше информации в байт, чем в нём есть бит. Поэтому в обиход вошли кодировки, где символ кодируется не одним байтом, а несколькими. UTF-8 не восьмая, не восьмибитная и не восьмибайтная кодировка. Она начинается с одного байта в восемь бит ширшиной. Её первые 127 символов полностью взяты из ASCII, но в байте 8 бит, и главный самый получается всегда ноль, потому что для записи 127 символов достаточно 7 бит. А восьмой не нужен. Поэтому восьмой бит в UTF он сигнальный. Он говорит, что за байтом с этим битом, если он не ноль, идёт второй байт, и это всё один символ. А во втором байте снова так же - 127 значений + бит. Если этот бит единичка, то значит, что дальше идёт байт, который всё ещё является продолжением текущего символа. Т.е. по факту там может быть целый поезд. UTF-8 кодировка перменной длинны. Если запишешь свою фразу на английском, то твой алгоритм будет работать. А сейчас пока ещё в PHP это $text[13]; всё еще способ доступа к отдельным байтам строки. Хотя уже давно идут разговоры за переход на UTF-8 нативно и прозрачно, но воз и ныне там.
Как то сложно выводить одну лишь буковку ( а задание все таки есть. и как его сделать я не понял. Странно что на курсах дают такое задание хотя заведомо его нельзя правильно решить в кириллице. Из это задания следует следующее, которое Вашим способом я не понимаю как сделать, возможно есть еще варианты? "Создайте переменную $game и присвойте ей значение 'Путешественник'. Обращаясь с этим словом как с отдельными символами составьте различные русские слова." - подскажите решение этой задачки, с учетом того что у меня проблема с кодировкой
всему миру насрать на твою кириллицу как было в книжке - так и перевели. переводчику особенно насрать - он не знает твоего этого пхп и программирования. по факту ты не загуглил и пропустил два решения сверху. ты должен был уже загуглить ту функцию, которую не знаешь. это плохо так пропускать. ты должен гуглить всё что встречаешь впервые.
@Taktreba если скрипт выполняется на сервере то установи кодировку ютф8 без бомсигнатуры и пошли html заголовок с явным указанием кодировки (для ие) если скрипт выполняется в консоли(винды) то установи кодировку скрипта ое866 так же в консоли перейди на нужную кодовую страницу так же можно самому пыху явно установить внутреннюю кодировку
Кодировку в первую очередь через в пхп надо указывать так header('Content-Type: text/html; charset=utf-8'); а потом уже можно мету писать. Потому что если браузер выбрал неверную кодировку, мету он не сможет прочитать
Боже, что выделаете? Вы что думаете, что скрипт тса не выведет "символы вопроса", если прописать header('Content-Type: text/html; charset=utf-8'); первой строкой кода? Так, вот - вывод никак не изменится и измениться не может. Каким образом это к сути вопроса относиться? Не запутывайте человека если нет твёрдого понимания причины возникновения у него проблемы. Тс, оба решения вызывают функции указывающие на решение проблемы (не говоря уже о текстовых пояснениях которые были даны исчерпывающие). Поэтому вашим действием должно стать прочтение описания этих функций на ресурсе php.net. Сложности решения нет ни в первой ни во второй реализации, вторая даже не такая избыточная как ваша (решение из учебника), поскольку не инициализирует десяток переменных для хранения в каждой из них по "букве", а использует массив.
@Taktreba @Zuldek всё же полагаю проблема с кодировкой, точнее с согласованостью кодировок браузера и выдаваемой страницы: PHP: $text = 'Мама мыла раму!'; $xe = $text[4]; echo $xe. '<br>'; xe равно пробелу те должен в отличии от кирилицы вывестись норм. энд кодировка также по умолчанию устанавливается в файле .htaccess