2

Проект разрабатывается в кодировке utf-8. Столкнулся с проблемой обработки строк с символами кириллицы. Код

<?
    header('Content-Type: text/html; charset=utf-8');

    $str =  "Дополнительное оборудование";

    echo substr($str, 0, 7);

    echo "<br>";

    $str =  "Dopolnitelnoe oborudovanie";

    echo substr($str, 0, 7);
?>

Выдает результат

Доп�
Dopolni

Т.е. для кириллицы функция не работает.

Что необходимо сделать, чтобы на выходе вместо "Доп�" получить "Дополни"?

4 ответа 4

6

Почитай http://php.net/manual/en/ref.mbstring.php

Если коротко, то для мультибайтовых кодировок используют mb_substr()

mb_substr($str, 0, 7, "UTF-8"); 
4
  • mbstring изучу, но сейчас нужно быстрое решение. mb_substr() возвращает "Доп�".
    – alexkad
    21 окт 2014 в 21:55
  • 1
    Передай в функцию используемую кодировку. echo mb_substr($str, 0, 7, "UTF-8");
    – Get
    21 окт 2014 в 22:15
  • Работает, спасибо!
    – alexkad
    22 окт 2014 в 4:58
  • У вас видимо старая версия PHP. В новых кодировка mb* функций по умолчанию - utf-8. Рекомендую в начале скрипта ставить mb_internal_encoding ("utf-8") чтобы задавать умолчание.
    – artoodetoo
    2 сен 2015 в 14:50
3

Если сайт разрабатывается, как вы пишите, в UTF-8, значит надо разрабатывать UTF-8. Чтобы все мультибайтовые функции работали по умолчанию с разрабатываемой кодировкой, ее надо задать в самом начале (и желательно проверить, задалась или нет):

const PAGE_ENCODING     ='UTF-8';

if(mb_internal_encoding(PAGE_ENCODING) != PAGE_ENCODING) 
throw new SomeException('There is no support encoding: '.PAGE_ENCODING);

Если все ок, можете юзать все mb_ без прописки кодировки.

Забыл написать, почему это важно, ну, если вы разрабатываете. Потому что при использовании имени функции в качестве callback прописывать кодировку будет некуда.

1

mb_substr() вместо substr()

3
  • Получается "Доп�". Как убрать символ �?
    – alexkad
    21 окт 2014 в 21:52
  • 1
    попробуйте последним аргументом добавить кодировку, то есть echo substr($str, 0, 7, "utf-8");
    – Diefair
    21 окт 2014 в 21:56
  • 1
    да, работает mb_substr($str, 0, 7, "UTF-8");
    – alexkad
    22 окт 2014 в 4:57
0

Чтобы в PHP работать с кириллическими строками посимвольно(включая извлечение подстроки и др.) нужно использовать специальные функции: http://php.net/manual/ru/ref.mbstring.php.

Всё из-за того, что на латинице 1 символ = 1 бит, поэтому:

$string = 'XYZ';
echo $string[0]; // будет равно X

Но кирилические символы занимают 2 бита, поэтому:

$string = 'ЭЮЯ';
echo $string[0]; // будет равно �

При этом можно это учитывать и работать в таком ключе:

$string = 'ЭЮЯ';
echo $string[0] . $string[1]; //output: Э

Или разбить строку через str_split, указав split_length = 2:

$string = 'ЭЮЯ';
$arrStr = str_split($string, 2); // = ['Э', 'Ю', 'Я']

Но так лучше не делать, потому что таким образом нельзя будет работать теперь с латиницей и остальными символами:

$string = 'ЭЮЯ. XYZAB';
$strArr = str_split($string, 2); // = ['Э', 'Ю', 'Я', '. ', 'XY', 'ZA', 'B']

Кстати, чтобы нормально разделить сроку с русскими символами на массив символов, то лучше всего это делать так:

$string = 'ЭЮЯ. XYZAB';
$strArr = preg_split('//u', $string, null, PREG_SPLIT_NO_EMPTY); // = ['Э', 'Ю', 'Я', '.', ' ', 'X', 'Y', 'Z', A', 'B']

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.