Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > После отработки substr появляется символ �


Автор: psworld 14.7.2010, 11:11
Кодировка UTF-8, после подключения к БД выполняется:

Код

    mysql_query ("set character_set_client='utf8'");
    mysql_query ("set character_set_results='utf8'");
    mysql_query ("set collation_connection='utf8_general_ci'");


Получаю данные из БД, далее на php ищу позицию входа некоторой подстроки, вычитаю из этой позиции 1 и обрезаю с помощью substr по данной метке. Иногда в конце обрезанной строки появляется символ �. Если вычитать 2, то пропадает, но появляется для других строк.

Как побороть?

Автор: ksnk 14.7.2010, 11:22
Цитата(psworld @  14.7.2010,  11:11 Найти цитируемый пост)
Как побороть?

использовать функции mb_* вместо строковых ?
Для utf-8 должно помочь

Автор: skyboy 14.7.2010, 11:26
используй mb_substr

Добавлено через 1 минуту и 59 секунд
упс, слишком долго отправлял smile
utf-8 - кодировка, в которой один символ может кодироваться одним байтом(латиница, цифры) или больше(для кирилицы уже два байта используются).
а substr "режет" не по символам, а по байтам. и у тебя остается только половина полного кода символа. 

Автор: smartov 14.7.2010, 12:14
Если не установлено расширение mb можно воспользоваться preg_ фугкциями. Они тоже умеют работать с utf8

Автор: NLspieler 14.7.2010, 17:18
Цитата(smartov @  14.7.2010,  12:14 Найти цитируемый пост)
Если не установлено расширение mb можно воспользоваться preg_ фугкциями. Они тоже умеют работать с utf8 

Как написать аналог md_substr, который будет работать с любым языком?

Автор: skyboy 14.7.2010, 22:19
Цитата(NLspieler @  14.7.2010,  16:18 Найти цитируемый пост)
который будет работать с любым языком? 

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

Автор: smartov 15.7.2010, 09:54
Цитата(NLspieler @  14.7.2010,  17:18 Найти цитируемый пост)

Как написать аналог md_substr, который будет работать с любым языком? 


Код

<?php

function _mb_substr($string, $start, $length = -1) {
    $preg_length = $length > 0 ? "{0,$length}" : '*';
    preg_match(sprintf('/^(.{%d})(.%s)(.*?)$/usD', $start, $preg_length), $string, $matches);
    return $matches[2];
}

var_dump(_mb_substr("С вас, ロイヤ, 5$ за разработку.\nИ даже 10 за поддержку multiline", 12, 27));



Деньги переводите на счет голодных детей Уганды

Автор: psworld 15.7.2010, 11:26
Спасибо всем за активность в теме, я пока в процессе экспериментов с различными вариантами smile. Вроде, выход нашел…

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)