$ _POST будет конвертировать из utf-8 в ä ö ¼ и т.д.
Я новичок здесь, поэтому я прошу прощения, если я делаю что-то неправильно.
У меня есть форма, которая вводит пользовательский ввод на другую страницу. Пользователь должен напечатать ä, ö, é и т.д. Я разместил в документе все следующие документы:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
header('Content-Type:text/html; charset=UTF-8');
<form action="whatever.php" accept-charset="UTF-8">
Я даже пробовал:
ini_set('default_charset', 'UTF-8');
Когда загружается другая страница, мне нужно проверить, что пользователь вводит с чем-то вроде:
if ( $_POST['field'] == $check ) {
...
}
Но если он вводит что-то вроде "München", PHP будет сравнивать "München" с "München" и никогда не будет запускать TRUE, даже если это необходимо. Поскольку во всем мире указано UTF-8, я предполагаю, что сервер конвертирует в нечто другое (Windows-1252, когда я читаю в другом потоке), потому что он не поддерживает или не настроен на UTF-8. Я использую Apache на локальном сервере, прежде чем загружать его в производство; Я не изменил (и не знаю, как) какие-либо настройки по умолчанию. Я работаю над Windows 7, редактируя с помощью Notepad ++, который поддерживает мои файлы в ANSI. Если я bin2hex('München')
, я получаю "4dc3bc6e6368656e".
Если я echo $_POST['field'];
, он отображает "München" правильно.
Я исследовал всюду для объяснения, все, что я нахожу, это то, что я должен включать те теги/заголовки, которые у меня уже есть.
Любая помощь очень ценится.
Ответы
Ответ 1
В то же время вы сталкиваетесь с множеством разных проблем, пусть начнется с самого простого.
Проблема 1) Вы говорите, что echo $_POST['field'];
отобразит его правильно? Что вы имеете в виду под "дисплеем"? Он может отображаться правильно в двух случаях:
- либо поле находится в UTF-8, и ваша страница была объявлена как UTF-8, а браузер отображает ее как UTF-8 или
- поле находится на латинском языке 1, и браузер решил (с помощью эвристики автоматического обнаружения), что ваша страница находится на латинице-1.
Итак, тот факт, что echo $_POST['field'];
правильный, ничего не говорит.
Проблема 2) Вы используете
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
header('Content-Type:text/html; charset=UTF-8');
Является ли этот PHP-код? Если это так, это будет ошибка, потому что заголовок должен быть установлен перед отправкой любого байта. Если вы это сделаете, вы не будете устанавливать заголовок Content-Type
, а PHP должен генерировать предупреждение.
Проблема 3) Вы используете
<form action="whatever.php" accept-charset="UTF-8">
Некоторые браузеры (в основном, IE) игнорируют accept-charset
, если они могут принуждать данные, отправляемые в ASCII или ISO Latin-1. Таким образом, данные будут в UTF-8 и объявлены как ISO Latin-1 или ISO Latin-1 и отправлены как ISO Latin-1 (но это второй случай не ваш случай).
Посмотрите fooobar.com/questions/477559/..., чтобы узнать, как решить эту проблему.
Проблема 4) Какие строки вы сравниваете? Например, если у вас есть
$city = "München"
$_POST['city'] == $city
Результат этого кода будет зависеть от кодировки файла PHP. Если файл закодирован в ISO Latin-1, а $_POST
правильно содержит данные UTF-8, ==
будет сравнивать разные байты и вернет false.
Ответ 2
Еще одно решение, которое может быть полезно в Apache, вы можете поместить директиву в свой файл конфигурации (httpd.conf) или .htacess, называемый AddDefaultCharset
. Это выглядит так:
AddDefaultCharset utf-8
http://httpd.apache.org/docs/2.0/mod/core.html#adddefaultcharset
Это будет отменять любые другие кодировки по умолчанию.
Ответ 3
Я изменил "mbstring.detect_order = pass" в моем файле php.ini, и я работал
Ответ 4
Я многократно использовал символы Unicode в своих формах и файлах. До сих пор у меня не было никаких проблем.
Попробуйте сделать эти шаги и проверьте результат:
- Удалите
header('Content-Type:text/html; charset=UTF-8');
из ваших кодов форм HTML.
- Используйте свою форму как
<form action="whatever.php">
без accept-charset="UTF-8"
. (Лучше вставить метод отправки данных в тег формы).
- На целевой странице (whatever.php) вставьте тег
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
в тег <head>
.
Я всегда делал свой проект так, как я упоминал здесь, и у меня не было никаких проблем с строками Unicode.
Ответ 5
Это связано с кодировкой символов файлов PHP.
Hardcoded München
хранится с символьной кодировкой исходного файла (ов), в данном случае ANSI
, и когда это значение сравнивается с кодированным значением UTF-8, указанным в переменной $_POST
, два, естественно, будут отличаться.
Решение вашей проблемы является одним из:
- Служить и обрабатывать контент с той же кодировкой, что и исходный файл (ы), в этом случае может быть
windows-1252
.
- Вначале это включало бы изменение
content="text/html; charset=UTF-8"
до content="text/html; charset=windows-1252"
при обслуживании данных HTML.
- Избегайте всех жестко заданных значений, которые могут быть затронуты проблемами кодировки символов между
UTF-8
и windows-1252
, более или менее только значениями жесткого кода, которые включают только английские буквы и цифры.
- Любые значения
UTF-8
должны быть прочитаны из источника, который гарантирует, что они закодированы UTF-8
(например, база данных настроена на использование UTF-8
как кодирование хранения, а также кодирование соединения).
- Оберните все жестко заданные назначения в
utf8_encode()
, например $value = utf8_encode ('München');
- Измените кодировку исходного файла (ов) на
UTF-8
.
- Это может быть выполнено любым количеством способов, достойный текстовый редактор сможет это сделать или выдающийся libiconv может быть используется, особенно для пакетной обработки.
Любое решение 1 или 4 будет моим предпочтительным решением, особенно если в проекте задействовано несколько человек.
В качестве примечания некоторые текстовые редакторы (особенно Notepad++
) имеют возможность использовать либо UTF-8
, либо UTF-8 without BOM
. BOM
(знак байтового байта) бессмыслен в UTF-8
и вызовет проблемы при написании заголовков в PHP (чаще всего при переадресации). Это связано с тем, что BOM
находится прямо перед начальным <?php
, заставляя сервер отправлять BOM
так же, как если бы у него был другой персонаж. Разница заключается в том, что вы должны отметить символ впереди, но BOM
не отображается.
Правило большого пальца: Всегда используйте UTF-8 без спецификации.