Вопрос по utf-8, yii, php, character-encoding, html – Ошибка с символами utf8 и htmlspecialchars в yii

5

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

 ./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

Итак, я проверил эту статью оЮникод в 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 ?

Спасибо

У меня та же проблема. Вы когда-нибудь находили решение? coderama
эти вопросительные знаки являются результатом недопустимых байтовых последовательностей UTF-8. Скорее всего, вы использовали редактор, который сохранял текст в однобайтовой кодировке, например, например,ISO 8859-1, Во всех однобайтовых кодировках, которые являются расширениями ASCII, расширенная часть имеет байтовые значения & gt; = 128. Все однобайтовые символы UTF-8 являются & lt; 128 все многобайтовые символы состоят из байтов & gt; = 128. Вот почему символы ISO 8859-x с диакритическими знаками становятся вопросительными знаками: они никогда не могут быть действительными в формате UTF-8, за исключением весьма маловероятных комбинаций. Walter Tross

Ваш Ответ

7   ответов
0

У меня тоже была эта проблема - особенно когда я пытался отобразить UTF текст из БД. Я изменил все сортировки и типы в mysql на utf8-bin - но все равно не люблю ... затем я попытался изменить все мои макеты и представления с помощью метатегов и т. Д ... черт, я даже посмотрел исходный код японских сайтов и вставил этот материал в ... ничего не получалось _ ... пока ... я наткнулся на этот пост:Дисплей Yii и UTF8, UTF8 работает с MySQL, но не с YII Backend  Оказывается, вам нужно настроить параметр в моем main.php в файле конфигурации, под компонентами .. f

2

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

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

как вызов заголовка может создать проблемы в будущем ???
6

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

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

"используя кодировку Unicode, такую как utf8" Это не хороший совет, это должно быть "использование кодировки UTF-8 Unicode". ДругойUnicode кодировки не рекомендуются для Интернета. ИBOM (метка порядка байтов) в UTF-8 практически не имеет смысла, большинство редакторов даже не рассматривают эту опцию для UTF-8 (правильно).
Я должен исправить себя: по-видимому, есть даже пример редактора, которыйnot возможность сохранить файл в кодировке UTF-8without спецификация: блокнот Microsoft. Пользователи Windows, не желающие использовать редактор IDE, могут по-прежнему использовать Notepad ++, который является бесплатным и очень удобным для пользователя.
0

Лучший способ обойти это использоватьhttp://www.utexas.edu/learn/html/spchar.html - в твоем случае C & # xF3; pyr & # xEE; ght будет выглядеть какC&#243;pyr&#238;ght

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

Несомненно, наилучшим образом при правильной настройке системы utf нет необходимости кодировать символы в html-сущности.
Не заслуживает понижения, потому что, хотя это не технически правильно, это вариант, о котором я рад знать.
«Лучший способ обойти это» значит обойти все осложнения UTF8, особенно true при работе с многобайтовыми символами и просмотре & # xFFFD; появляется для пользовательского агента (браузеры) с другим набором шрифтов.
1

htmlspecialchars Проблема проверить этот ответ:https://stackoverflow.com/a/3803972/133408

Вы должны указать кодировку в качестве 3-го параметраhtmlspecialchars

4

вы должны понимать, что символ с диакритическим знаком, подобным & # xF3; или & # xEE; (из вашего примера) автоматически не является символом «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), как последовательность шестнадцатеричных байтов с соответствующей строкой на стороне. Если файл имеет однобайтовую кодировку, ваши & quot; проблемные символы & quot; будет одним байтом & gt; = 0x80. Если кодируется UTF-8, это будут последовательности по 2 байта (другие будут по 3 или более байтов), все & gt; = 0x80, в то время как "без проблемных символов" останется одним байтом & lt; 0x80.

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

Вы не нуждаетесь вAddDefaultCharset директива в.htaccess файл, если все ваши страницы генерируются с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,потому что это твой друг!

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

+10 за исчерпывающий ответ и грустное лицо в конце, которое в UTF
1

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

Похожие вопросы