За последние 24 часа нас посетили 22676 программистов и 1278 роботов. Сейчас ищут 802 программиста ...

На сайте знаки вопроса в ромбике

Тема в разделе "PHP для новичков", создана пользователем viktor72, 13 авг 2016.

  1. viktor72

    viktor72 Активный пользователь

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Добрый день!
    Сайт написан на php , база mysql . Везде поставлена кодировка utf-8.
    Из базы выводятся статьи -
    Код (Text):
    1. echo "<td class='tablic2'>".substr($result[traid_mark],0,50)."</td>";    
    и если количество символов больше , чем в ограничении, то в конце выводится черный ромбик с вопросом внутри.
    Подскажите что делать.
    Спасибо.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Использовать мультибайтные функции для работы со строками. mb_substr() например.
     
    viktor72 нравится это.
  3. viktor72

    viktor72 Активный пользователь

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Спасибо, но уже пробовал. К сожалению не помогает.
    Где может таится проблема?
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Проблема может таиться в отсутствии предварительной настройки библиотеки мультибайтных строк. Нужно установить рабочие кодировки.
     
    viktor72 нравится это.
  5. viktor72

    viktor72 Активный пользователь

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Моего начального уровня хватит или призывать специалиста?
    для меня это не знакомые понятия. или смогу разобраться? ккуда смотреть? где искать?
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    у mb_substr() есть последний параметр: кодировка. Укажите его. Или в начале используйте mb_internal_encoding
     
    viktor72 нравится это.
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Вообще, должно хватить. Но я тут наблюдаю проблемы в общении с мануалом. Так что может и не хватить...

    Вот описание функции mb_substr() - https://secure.php.net/manual/en/function.mb-substr.php
    Сигнатура как у однобайтного брата, за исключением дополнительного параметра - кодировки строки.
    Если он не указан - подставляется текущее значение внутренней кодировки. Её можно установить через https://secure.php.net/manual/en/function.mb-internal-encoding.php
     
    viktor72 нравится это.
  8. viktor72

    viktor72 Активный пользователь

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Свершилось чудо!
    Вписал
    Код (Text):
    1. mb_internal_encoding("UTF-8");
    прямо в цикл, который выводит статьи на страницу и все ночные приведения исчезли!
    Возможно я сделал не правильно, у меня действительно проблема чтения мануала, пока что он для меня написан на недоступном языке для понимания. Если я что сделал не так, буду рад комментарию.
    Спасибо
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    ну если прям реально "в цикле" - то вынести из цикла.
     
    viktor72 нравится это.
  10. viktor72

    viktor72 Активный пользователь

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Конкретизирую -
    сделал так:
    Код (Text):
    1.  
    2. while ($result = mysql_fetch_array($sql))
    3. {
    4. ....
    5. mb_internal_encoding("UTF-8");
    6. .....}
    не правильно? вписать выше цикла или ниже цикла?
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    Откуда вообще такие вопросы возникают?

    Функция устанавливает значение. Один раз. Но ты это делаешь внутри цикла. Зачем? Вынеси из цикла.
    Вверх или вниз? Ну если ты в теле цикла не работаешь с мультибайтными функциями, то тебе не принципиально устанавливать кодировку до тела цикла. Выноси вниз. А если работаешь - значит кодировка к этому момент уже должна быть установлена. Выноси вверх.

    Всё логично?
     
    denis01 и viktor72 нравится это.
  12. viktor72

    viktor72 Активный пользователь

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Вынес выше цикла. Всё работает нормально.
    Спасибо.