За последние 24 часа нас посетили 17825 программистов и 1609 роботов. Сейчас ищут 1406 программистов ...

Кириллица и мефодица

Тема в разделе "Прочие вопросы по PHP", создана пользователем DeadMoroz, 5 июл 2014.

  1. DeadMoroz

    DeadMoroz Новичок

    С нами с:
    27 июн 2013
    Сообщения:
    18
    Симпатии:
    0
    Друзья, помогите, плиз.
    Имею текстовый файл на клиенте, сохранен в utf-8. Закачиваю его на сервер. Там (встроенный редактор на сервере) он отображается примерно так:
    "01.12.2006, 19:00 |Артем Бетев Через месяц снова вступят
    Имеется также такой скрипт:
    header("Content-Type: text/html; charset=UTF-8");
    mb_internal_encoding("UTF-8");
    $str = file_get_contents("../scripts/2.txt");
    echo $str . "<br />";
    echo $str[25];
    Первое эхо выводит удобоваримый текст.
    Второе выдает: �
    В чем тут может быть засада?
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Сохраните страницу не просто в UTF-8, а UTF-8 без BOM. Первые символы (п»ї) говорят о том, что маркер у вас присутствует.
     
  3. DeadMoroz

    DeadMoroz Новичок

    С нами с:
    27 июн 2013
    Сообщения:
    18
    Симпатии:
    0
    сохранил без ВОМ, результат тот же
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.793
    Симпатии:
    1.330
    Адрес:
    Лень
    скрипт PHP на сервере перекодируй
     
  5. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Если вы не прописываете текст статично, а получаете данные из БД, файла и т.д., то скорее всего, что исходная кодировка cp1251. Если данные из базы, то установите сранение полей "utf8_general_ci". Но для начала, попробуйте указать кодировку из php: после подключения к базе, выполните запрос:
    Код (Text):
    1. SET NAMES utf-8
    P.S. Не помешает еще в htaccess прописать строку:
    Код (Text):
    1. AddDefaultCharset UTF-8
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.793
    Симпатии:
    1.330
    Адрес:
    Лень
    $str = file_get_contents("../scripts/2.txt");
     
  7. DeadMoroz

    DeadMoroz Новичок

    С нами с:
    27 июн 2013
    Сообщения:
    18
    Симпатии:
    0
    Текст беру из файла. Специально перекодировал его в utf-8 без бом. В базу он, кстати, записался корректно, там кодировка utf-8.
    htaccess отредактировал. Результат прежний ((

    Добавлено спустя 1 минуту 2 секунды:
    А как задать кодировку скрипта на сервере?
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Код (PHP):
    Я вообще говорил о файле-обработчике или документе, который выводит данные на экран.
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    сначала надо поставить диагноз, потом лечить.

    я уверен, что твой "встроенный редактор на сервере" показывает тебе текст в кодировке windows-1251. при этом данные на самом деле в utf-8, просто браузер об этом не догадывается )))
    это несложно проверить заглянув в инфу о странице в браузере. глянь и расскажи что увидел. какая кодировка выбрана браузером?
     
  10. DeadMoroz

    DeadMoroz Новичок

    С нами с:
    27 июн 2013
    Сообщения:
    18
    Симпатии:
    0
    Абсолютно верно.

    Добавлено спустя 18 минут 30 секунд:
    Такс, если загрузить на сервер текстовый файл в windows-1251, и оставить в скрипте только вот это:
    $str = file_get_contents("../scripts/2.txt");
    echo $str . "<br />";
    echo $str[35];
    то все отображается корректно, и даже вот эта функция делает то, что от нее хотят:
    echo "up: " . mb_strtoupper($str[35]) . "<br />";
    а в чем же была засада? где-то еще надо было прописывать utf-8? или эта windows-1251 где-то на сервере вшита намертво, и ее не победить?
     
  11. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    ты скажи что это блеать за "встроенный редактор"? в админке хостинга чтоли? если так, просто забей на это. такая админка не годится для реальной жизни. просто выкладывай правильные файлы и получай правильный результат.

    кривожопая адмника хостинга это недостаточная причина, чтобы портить свои скрипты.

    Добавлено спустя 3 минуты 52 секунды:
    это допустимо только для однобайтовых кодировок. в мультибайтовых (как utf-8) только символы латиницы занимают один байт, а буквы других алфавитов — от двух до четырех байт на символ. поэтому правильнее будет писать так: mb_substr($str, 35, 1)
     
  12. DeadMoroz

    DeadMoroz Новичок

    С нами с:
    27 июн 2013
    Сообщения:
    18
    Симпатии:
    0
    В админке хостинга, точно.
    За mb_substr($str, 35, 1) спасибо, наставили на путь истинный
     
  13. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    еще важно: чтобы мультибайтовые функции работали везде правильно, надо где-то в начале делать
    Код (PHP):
    в новых версиях PHP вроде это поведение по-умолчанию, но в старых без этого будут глюки.
     
  14. DeadMoroz

    DeadMoroz Новичок

    С нами с:
    27 июн 2013
    Сообщения:
    18
    Симпатии:
    0
    ага, это дело стоит