Вечер добрый! В общем такая ситуация: Есть простейшая конструкция: PHP: $cityArray = array( "Украина" => array("Киев", "Запорожье", "Днепр", "Донецк", "Луганск", "Чернигов", "Одесса", "Львов"), "Германия" => array("Берлин", "Мюнхен", "Бавария", "Кёльн", "Дрезден", "Гамбург", "Лейпциг", "Нюрнберг"), "Франция" => array("Pариж", "Лион", "Ницца", "Марсель", "Тулуза", "Бордо", "Ренн", "Орлеан"), "Италия" => array("Рим", "Милан", "Неаполь", "Флоренция", "Верона", "Турин", "Палермо", "Генуя") ); foreach ($cityArray as $country => $city) { // Вывести название стран: echo( "<h2>$country</h2>" . "<ul>" ); // Вывести города начинающиеся на "К": foreach ($city as $key => $cities) { if($cities[0] == "К") echo"<li>$cities</li>"; } // Завершить список: echo("</ul>"); } По логике должен выводить название страны и города которые начинаются на букву "К". Но выводит только страны. Если же заменить букву "К" на английскую "P" то выведет название стран и во "Франции" "Pариж". Файл сохранял уже в разных кодировках, в браузере все отображается нормально, все без иероглифов, пока не пытаюсь вывести результат поиска по первой букве. Если сделать конструкцию плана: PHP: foreach ($city as $key => $cities) { echo"<li>$cities[0]</li>"; } То выведет на экран страны на русском, а первые буквы названия городов в ромбике со знаком вопроса. Что уже делал: - В .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 гуглить тоже пробовал.
А ты бери не первый байт, а первый символ - mb_substr(..., 0, 1) Это особенность хранения строк в пхп.
Юникод - мультибайтная кодировка. Мультибайтная она не просто так. Для глифов, входящих в малую таблицу ASCII всегда используется один байт. А старшей таблицы просто не существует. Она всегда представляется 2 байтами из которых один - явно указывает, что глиф описан двумя байтами. Когда ты используешь [0] или substr - и используешь методики, которые работают с байтами в строке. Когда начинаешь использовать mb_*-функции - начинаешь работать с символами в строке. Ромбик ты получаешь как прямое следствие своей ошибки. Ты из двух байт одного символа выхватываешь один байт и показываешь его в потоке. Браузер по всему данному тобой набору пытается трактовать этот байт как юникод. Он видит, что этот байт из "старшей" таблицы, следовательно, следующий байт - должен дополнить текущий. Но он не дополняет. И приходится браузеру показывать глиф сильного удивления.