$ _POST преобразует из utf-8 в ä ö ü и т. Д. - PullRequest
12 голосов
/ 25 января 2012

Я новичок здесь, поэтому я прошу прощения, если я делаю что-то не так.

У меня есть форма, которая передает пользовательский ввод на другую страницу.Предполагается, что пользователь будет печатать ä, ö, é и т. Д. Я поместил в документ все следующее:

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

Я искал повсюду объяснения, все, что я должен найтивключите те теги / заголовки, которые у меня уже есть.

Любая помощь очень ценится.

Ответы [ 5 ]

14 голосов
/ 04 февраля 2012

Вы сталкиваетесь с множеством разных проблем одновременно, давайте начнем с самой простой.

Задача 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 (но этот второй случай не ваш случай).

Посмотрите на https://stackoverflow.com/a/8547004/449288 чтобы увидеть, как решить эту проблему.

Задача 4) Какие строки вы сравниваете?Например, если у вас есть

$city = "München"
$_POST['city'] == $city

Результат этого кода будет зависеть от кодировки файла PHP.Если файл закодирован в ISO Latin-1 и $_POST правильно содержит данные UTF-8, == будет сравнивать разные байты и вернет false.

3 голосов
/ 09 марта 2016

Я изменил «mbstring.detect_order = pass» в моем файле php.ini, и я работал

3 голосов
/ 25 января 2012

Другое решение, которое может быть полезным, - это Apache, вы можете поместить директиву в свой конфигурационный файл (httpd.conf) или .htacess с именем AddDefaultCharset. Это выглядит так:

AddDefaultCharset utf-8

http://httpd.apache.org/docs/2.0/mod/core.html#adddefaultcharset

Это переопределит любые другие наборы символов по умолчанию.

0 голосов
/ 26 января 2012

Это связано с кодировкой символов файла (ов) PHP.

В жестком коде München хранится кодировка символов исходного файла (файлов), в данном случае ANSI, и когда это значение сравнивается с кодированным значением UTF-8, указанным в переменной $_POST, два, естественно, будут отличаться.

Решением вашей проблемы является одно из:

  1. Служить и обрабатывать содержимое в той же кодировке, что и исходные файлы, в этом случае, вероятно, будет windows-1252.
    • Для начала это будет включать изменение content="text/html; charset=UTF-8" на content="text/html; charset=windows-1252" при каждой передаче данных HTML.
  2. Избегайте всех жестко закодированных значений, которые могут быть затронуты проблемами кодировки символов между UTF-8 и windows-1252, более или менее только значениями жестких кодов, которые только включают английские буквы и цифры.
    • Любые значения UTF-8 должны быть считаны из источника, который обеспечивает их кодирование UTF-8 (например, база данных, в которой для использования UTF-8 задана кодировка хранилища, а также кодировка соединения).
  3. Обернуть все жестко заданные назначения в utf8_encode(), например $value = utf8_encode ('München');
  4. Измените кодировку исходного файла (файлов) на UTF-8.
    • Это может быть выполнено любым количеством способов, приличный текстовый редактор сможет сделать это или выдающийся libiconv , особенно для пакетной обработки.

Любое решение 1 или 4 будет моим предпочтительным решением, особенно если в проекте участвует несколько человек.

В качестве дополнительного примечания некоторые текстовые редакторы (в частности, Notepad++) могут использовать UTF-8 или UTF-8 without BOM. BOM (Порядок следования байтов) бессмысленен в UTF-8 и вызовет проблемы при записи заголовков в PHP (чаще всего при выполнении перенаправления). Это связано с тем, что BOM находится прямо перед начальным <?php, в результате чего сервер отправляет BOM точно так же, как если бы перед ним находился любой другой символ. Разница в том, что вы заметите символ впереди, но BOM не отображается.
Основное правило: Всегда используйте UTF-8 без спецификации.

0 голосов
/ 25 января 2012

Я использовал символы Юникода в моих формах и файлах много раз.У меня не было никаких проблем до сих пор.Попробуйте выполнить следующие действия и проверьте результат:

  1. Удалите header('Content-Type:text/html; charset=UTF-8'); из кодов HTML-форм.
  2. Используйте вашу форму, как <form action="whatever.php"> без accept-charset="UTF-8".(Лучше вставить метод отправки данных в тег формы).
  3. На целевой странице (what.php) вставьте снова <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> в тег <head>.

Я всегда делал свой проект так, как упомянул здесь, и у меня не было проблем со строками Unicode.

...