За последние 24 часа нас посетили 52724 программиста и 1769 роботов. Сейчас ищут 890 программистов ...

Помогите с кодировкой вывода массива

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

  1. servitpol

    servitpol Новичок

    С нами с:
    17 авг 2016
    Сообщения:
    63
    Симпатии:
    3
    Вечер добрый! В общем такая ситуация:
    Есть простейшая конструкция:
    PHP:
    1. $cityArray = array(
    2.             "Украина" => array("Киев", "Запорожье", "Днепр", "Донецк", "Луганск", "Чернигов", "Одесса", "Львов"),
    3.             "Германия" => array("Берлин", "Мюнхен", "Бавария", "Кёльн", "Дрезден", "Гамбург", "Лейпциг", "Нюрнберг"),
    4.             "Франция" => array("Pариж", "Лион", "Ницца", "Марсель", "Тулуза", "Бордо", "Ренн", "Орлеан"),
    5.             "Италия" => array("Рим", "Милан", "Неаполь", "Флоренция", "Верона", "Турин", "Палермо", "Генуя")
    6.     );
    7.     foreach ($cityArray as $country => $city)
    8.     {
    9.     // Вывести название стран:
    10.     echo(
    11.         "<h2>$country</h2>" .
    12.         "<ul>"
    13.         );
    14.     // Вывести города начинающиеся на "К":
    15.         foreach ($city as $key => $cities)
    16.         {
    17.             if($cities[0] == "К")
    18.             echo"<li>$cities</li>";
    19.         }
    20.        
    21.     // Завершить список:
    22.         echo("</ul>");
    23.     }
    По логике должен выводить название страны и города которые начинаются на букву "К". Но выводит только страны. Если же заменить букву "К" на английскую "P" то выведет название стран и во "Франции" "Pариж".

    Файл сохранял уже в разных кодировках, в браузере все отображается нормально, все без иероглифов, пока не пытаюсь вывести результат поиска по первой букве.

    Если сделать конструкцию плана:
    PHP:
    1. foreach ($city as $key => $cities)
    2.         {
    3.             echo"<li>$cities[0]</li>";
    4.          
    5.         }
    То выведет на экран страны на русском, а первые буквы названия городов в ромбике со знаком вопроса.

    Что уже делал:
    - В .htaccess прописана строка AddDefaultCharset UTF-8;
    - ту да же тулил CharsetDisable Off //(on);
    - В редакторе сохранял во всевозможных кодировках;
    - Дописывал <?php header('Content-Type: text/html; charset=utf-8'); ?>;
    - Делал html разметку включая строки кодировки <meta charset="utf-8"> и ее другие вариации;
    - var_dump($cities); - выводит данные на русском языке;
    - var_dump($cities[0]); - выводит первую букву в виде ромбика с вопросительным знаком.


    P/S гуглить тоже пробовал.
     
  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    А ты бери не первый байт, а первый символ - mb_substr(..., 0, 1)
    Это особенность хранения строк в пхп.
     
    servitpol нравится это.
  3. servitpol

    servitpol Новичок

    С нами с:
    17 авг 2016
    Сообщения:
    63
    Симпатии:
    3
    @Ganzal получилось, спасибо!!
    При чем я пробовал через substr($citys, 0, 1); не вышло(((
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Юникод - мультибайтная кодировка. Мультибайтная она не просто так. Для глифов, входящих в малую таблицу ASCII всегда используется один байт. А старшей таблицы просто не существует. Она всегда представляется 2 байтами из которых один - явно указывает, что глиф описан двумя байтами. Когда ты используешь [0] или substr - и используешь методики, которые работают с байтами в строке. Когда начинаешь использовать mb_*-функции - начинаешь работать с символами в строке. Ромбик ты получаешь как прямое следствие своей ошибки. Ты из двух байт одного символа выхватываешь один байт и показываешь его в потоке. Браузер по всему данному тобой набору пытается трактовать этот байт как юникод. Он видит, что этот байт из "старшей" таблицы, следовательно, следующий байт - должен дополнить текущий. Но он не дополняет. И приходится браузеру показывать глиф сильного удивления.
     
    servitpol нравится это.
  5. servitpol

    servitpol Новичок

    С нами с:
    17 авг 2016
    Сообщения:
    63
    Симпатии:
    3
    @Ganzal вот теперь понятно в чем ошибка, спасибо еще раз!!!!!!!!