yaleksandr89
@yaleksandr89
PHP developer

Не могу получить символ из строки (кириллица) как исправить?

Здравствуйте.
Столкнулся с некорректной обработкой и выводом русских символов. Ранее с подобными проблема встречался и без проблем решал, а сейчас битый час сижу и уже ощущаю себя героем фразы "Стою на асфальте в лыжи обутый..."

Приведу простой пример:
$test1 = 'abc';
$test2 = 'абс';

echo $test1 . '<br>'; // вывожу всю строку на английском
echo $test2 . '<br>'; // вывожу всю строку на русском
echo $test1[1] . '<br>'; // вывожу англ. 'b'
echo $test2[1] . '<br>'; // вывожу рус. 'б'


В итоге получаю следующее
5e3bfcf48a681087527281.png
т.е. вся строка на русском выводиться без проблем, но при попытке получить отдельный символ строки – шиш с маслом. Пробовал следующее:
1) Добавлял
header('Content-Type: text/html; charset=windows-1251');
. В таком случае в кракозябры превращается и вся строка с кириллицей
5e3bfdcca2556212466483.png
2) Добавлял файл .htaccess и в файле прописывал: PHP_VALUE default_charset windows-1251
Безрезультатно (результат, как в пункте 1). С чем это связано? В какие настройки ещё смотреть?
  • Вопрос задан
  • 136 просмотров
Решения вопроса 2
l3ftoverz
@l3ftoverz Куратор тега PHP
Люблю Финский металкор
Дело не совсем в кодировке, если я верно помню, обращение к строке с индексом достаёт не её символ, а именно байт, который находится на этом месте, но не во всех кодировках используется один байт на символ, поэтому и получается так.

Например даже сделав так:
$a = 'АБВ';
echo $a[5];

Ты получишь кракозябру, а не ошибку, что такого индекса нет, хотя на вид его и правда вроде бы нет, ведь всего 3 буквы.

А сделав так:
<?php
$a = 'АБВ';

echo strlen($a);

Ты получишь 6, а не 3, по той же причине.

Как сказали выше - нужно использовать функции для работы с многобайтовыми кодировками, они имеют префикс mb_* и не обращаться к строке по индексам, что бы не получить таких вот сюрпризов.

Сделав:
<?php
$a = 'АБВ';

echo mb_strlen($a);

Ты получишь те самые, верные 3.
Ответ написан
@Hellayas
Предлагаю прочитать про эту функцию
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
DANYCOM Краснодар
от 50 000 до 100 000 ₽
ЧИТАЙ-ГОРОД Москва
от 140 000 до 210 000 ₽
ЭР-Телеком Пермь
от 80 000 ₽
30 мар. 2020, в 22:43
1200 руб./за проект
30 мар. 2020, в 22:39
3000 руб./за проект
30 мар. 2020, в 21:09
1000 руб./в час