У меня проблема с кодировкой 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ópyrîght
Кроме того, я добавлю в HTML <meta charset="utf-8">
чтобы убедиться, что браузеры ведут себя.
У меня тоже была эта проблема – особенно когда я пытался отображать utf-текст из db. Я изменил все коллажи и типы в mysql на utf8-bin – но до сих пор не люблю … тогда я попытался использовать все мои макеты и представления с метатегами и т. Д. … черт, я даже посмотрел на исходный код японских сайтов и вставлял этот материал в … НИЧЕГО НЕ РАБОТАЕТ _ … UNTIL … Я столкнулся с этим сообщением: Yii и UTF8 Display, UTF8 работает с mysqli, но не с бэкэндом yii. Оказывается, вам нужно подкрутить настройку в моей основной. php в файле конфигурации, под компонентами. f