PHP и UTF-8 всё таки жизнь возможна или нет?

Не приходилось работать со строками в PHP и сегодня обнаружил большую Ж.
1. ord("Ф") оказалось не работает с UTF.

Вот так код:
$str = "Привет, Алексей, как твои дела?";
$mas = str_split($str);
$c = count($mas);

for($i=0;$i<$c;$i++) {
echo $mas[$i]."-";
}

Выдал несуразицу!
�-�-�-�-�-�-�-�-�-�-�-�-,- -�-�-�-�-�-�-�-�-�-�-�-�-�-�-,- -�-�-�-�-�-�- -�-�-�-�-�-�-�-�- -�-�-�-�-�-�-�-�-?-

Как мне на выходе получать что-то приличное?
На сервере кодировка UTF-8, код пишется с NotePad++ с UTF-8 без BOM
PHP Version 5.3.10

Даже iconv_set_encoding($str, "UTF-8"); перед преобразованием в массив.
без толку всё.

Помогите понять, что и как?
  • Вопрос задан
  • 1104 просмотра
Решения вопроса 2
@IceJOKER
Web/Android developer
Мне кажется или в комментариях есть решения для данной проблемы?
php.net/manual/ru/function.str-split.php
Ответ написан
prototype_denis
@prototype_denis
Symfony
<?php

$string = "Привет, Алексей, как твои дела?";
$array  = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@hurgadan
А вы mbstring ипользуете? По всей видимости нет. Изначально функции обработки строк в PHP не умеют работать с многобайтными кодировками, UTF8 например. В строке
$str = "Привет, Алексей, как твои дела"; каждый символ представлен двумя байтами, если ваш скрипт в UTF8, и если не установлен mbstring/не включена перегрузка строковых функций, то вы получите то что указали выше.
Установите mbstring, включите перегрузку строковых функций или же используете сразу перегруженные функции
php.net/manual/ru/mbstring.overload.php
Ответ написан
@pibiv
А вы уверены что у вас заголовке страницы на которую вы делаете вывод установлена правильная кодировка? Когдато мучался неделю с подобной проблемой а потом выяснилось что в хедере небыло правильно кодировки.

<head>
        <meta charset="utf-8">
        <title>Кодировка HTML-страницы</title>
    </head>
Ответ написан
archakov06
@archakov06
Frontend-разработчик (ReactJS)
iconv() юзать не пробовали?
Ответ написан
wladyspb
@wladyspb
Программист
В нотпаде проверьте саму страницу в которой код - преобразовать в utf-8 без бом (ну так, на всякий случай, у самого бывало), страницу, которую выводите проверьте, в браузере проверьте какую кодировку браузер установил (он тоже иногда не догоняет)

Для начала нужно локализовать ошибку, а то непонятно куда копать. Попробуйте сам текст никак не редактируя вывести - что будет?

UPD:
Замечание:
Функция str_split() производит разбивку по байтам, а не по символам, в случае использования строк в многобайтных кодировках.

Вот и ответ.... Преобразуйте в другую кодировку, если хотите побуквенно разбить.
Ответ написан
Acuna
@Acuna
Заполнил свой профиль
Смотрите в сторону mb_* функций. Все уже создано за Вас, разжевано и положено в рот. Разве что Вашу функцию нужно доработать:

<?php

function mb_str_split ($string) {

    $array = array ();
    $strlen = mb_strlen ($string);

    while ($strlen) {

        $array[] = mb_substr ($string, 0, 1, 'UTF-8');
        $string = mb_substr ($string, 1, $strlen, 'UTF-8');
        $strlen = mb_strlen ($string);

    }

    return $array;

}

?>


И не надо ничего конвертировать, это от нежелания решать проблему.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы