$ _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 без спецификации.