Ошибка с utf8-символами и htmlspecialchars в yii

У меня проблема с кодировкой char в yii. Если я создам новый webapp:

./Yii-framework/framework/yiic webapp MyTest 

Затем перейдите в /protected/views/layouts/main.php и измените нижний колонтитул на текст с символом utf8, например

 <div id="footer"> Cópyrîgth <br /> </div> 

Обновите страницу, и все в порядке. Ницца! 😉

И затем я пытаюсь войти в систему с именем utf8 в имени пользователя, например, ádmin , он выдает сообщение:

 Error 500 htmlspecialchars(): Invalid multibyte sequence in argument 

Поэтому я проверил эту статью о unicode в yii

а затем я пошел в /protected/config/main.php и добавил эту строку в начале:

 header('Content-Type: text/html; charset=utf-8'); 

Повторная попытка повторного входа в систему снова работает (не сбой), но теперь нижний колонтитул сломан и показывает:

 C pyr ght 

Я пробовал другие комбинации, как описано в статье «Юникод в yii», но ни один из них не позволяет одновременно работать над обеими вещами.

Любые идеи для решения этой проблемы?

Примечание. Я не могу изменить файл php.ini.

Я также попробовал параметр AddDefaultCharset UTF-8 в файле .htaccess и поместил его в папку в / MyTest /, что правильная папка, упомянутая в статье, как: ваш DocumentRoot ?

благодаря

Я не совсем знаком с yii, но, если вы хотите вставлять в файл буквенные символы Unicode, вы должны убедиться, что ваш текстовый редактор сохраняет файл с помощью кодировки unicode, например utf8. Попробуйте utf8, без спецификации.

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

Во-первых, вам нужно понять, что персонаж с диакритикой типа «или» (из вашего примера) не является автоматически «символом utf-8». Это просто символ, который имеет разные кодировки (если есть) в разных наборах символов, даже в тех наборах символов, которые имеют основную однобайтную часть ASCII (например, английский алфавит, цифры, наиболее часто используемые знаки пунктуации и еще несколько). Вы можете назвать это «проблемным персонажем», но не «символом utf-8».

Итак, когда вы написали свой нижний колонтитул <div> , вы НЕ записали кодировку UTF-8. Ваш редактор сохранил эти символы в однобайтовой кодировке, например, ISO 8859-1 или один из ее родственников.

Браузеры обычно автоматически определяют кодировку, используемую на странице, если она не указана. Вот почему вы изначально могли видеть в браузере именно то, что вы написали в своем редакторе.

Затем вы попытались войти в систему с «проблемным символом» в имени пользователя. Браузер интерпретировал вашу страницу как однобайтную кодировку, поэтому это заставило ее кодировать ввод формы так же, как и отправить его на один байт на сервер. По-видимому, код PHP не был написан с этой возможностью, по-видимому, потому что он по умолчанию не задал третий параметр htmlspecialchars() , который по умолчанию является "UTF-8" (начиная с PHP 5.4.0 – это был "ISO-8859-1" раньше). Поскольку однобайтная закодированная строка с «проблемными символами» почти никогда не является допустимой строкой UTF-8 (см. Мой комментарий к вашему вопросу, это второй комментарий), htmlspecialchars () отклонил ее.

Затем вы правильно добавили header('Content-Type: text/html; charset=utf-8'); , который отключил автоматическое обнаружение набора символов браузером. На этом этапе стало очевидно, что ваш файл с нижним колонтитулом <div> не был закодирован в кодировке UTF-8 (см. Снова мой комментарий для объяснения вопросительных знаков, которые появляются вместо «проблемных символов»).

Таким образом, все, что вам нужно сделать, – убедить своего редактора сохранить файлы UTF-8 в кодировке. Как отмечали другие, сохранение файла в другой кодировке не работает во всех редакторах. Исход из нового файла иногда является решением, возможно, после установки кодировки по умолчанию вашего редактора на UTF-8.

Чтобы проверить кодировку, вы можете использовать команду file в оболочке. Его выход должен быть чем-то вроде

 main.php: PHP script, UTF-8 Unicode text 

Или же вы можете использовать команду od -tx1z , которая выгружает ваш файл (возможно, | less ), как последовательность шестнадцатеричных байтов с соответствующей строкой на стороне. Если файл является однобайтным, ваши «проблемные символы» будут одиночными байтами> = 0x80. Если это кодировка UTF-8, они будут состоять из 2 байтов (другие будут 3 или более байтов), all> = 0x80, а «неигровые символы» будут оставаться одиночными байтами <0x80.

Статья, которую вы упомянули, кажется, хорошо написана, просто следуйте ей.

Вам не нужна директива AddDefaultCharset в файле .htaccess , хотя, если все ваши страницы сгенерированы с помощью Content-Type: text/html; charset=utf-8 Content-Type: text/html; charset=utf-8 HTTP, потому что эффект директивы Apache точно такой же (и хорошо держать контроль над кодировкой внутри PHP).

Добавление <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> имеет такой же эффект для браузера, как и указанный выше HTTP-заголовок (обратите внимание на http- equiv ). HTTP-заголовок более чистый, но этот дополнительный метатег может помочь, если страница будет сохранена без информации заголовка.

Самое главное, не бойтесь UTF-8 , потому что это ваш друг!

(… но из ответа, который получил вашу награду, я вижу, что вы, как и многие люди, продолжаете думать, что понимание кодировок символов слишком сложно для вас ☹)

Во-первых, вы должны удалить вызов заголовка в файле main.php, это может создать проблемы для вас в будущем.

Во-вторых, я бы сделал то, что предложил драйвер rambo, и убедитесь, что ваши файлы сохранены как UTF8 в вашем редакторе.

Вышеупомянутые решения выглядят правильно, так как Yii действительно не имеет проблемы с юникодами, но вы также можете выполнять некоторые дополнительные проверки, такие как charset в метатеге на вашей странице Html, для utf-8, и вместо того, чтобы писать простой html, вы может использовать Chtml :: encode (Copyright), чтобы yii обрабатывал кодировку. Для части имени пользователя убедитесь, что в Charset по умолчанию в вашей базе данных также установлено значение utf8.

Для проблемы htmlspecialchars проверьте этот ответ: https://stackoverflow.com/a/3803972/133408

Вы должны указать кодировку как третий параметр htmlspecialchars

Лучше всего это использовать http://www.utexas.edu/learn/html/spchar.html – в вашем случае Cópyrîght появится как C&#243;pyr&#238;ght

Кроме того, я добавлю в HTML <meta charset="utf-8"> чтобы убедиться, что браузеры ведут себя.

У меня тоже была эта проблема – особенно когда я пытался отображать utf-текст из db. Я изменил все коллажи и типы в mysql на utf8-bin – но до сих пор не люблю … тогда я попытался использовать все мои макеты и представления с метатегами и т. Д. … черт, я даже посмотрел на исходный код японских сайтов и вставлял этот материал в … НИЧЕГО НЕ РАБОТАЕТ _ … UNTIL … Я столкнулся с этим сообщением: Yii и UTF8 Display, UTF8 работает с mysqli, но не с бэкэндом yii. Оказывается, вам нужно подкрутить настройку в моей основной. php в файле конфигурации, под компонентами. f