PHP 5.4 составная/форма-кодировка данных UTF-8
У меня возникли проблемы с кодировкой UTF-8 при публикации данных формы как "составные/данные формы", без составных/данных формы все работает хорошо. Но так как мне нужно загружать файлы в один и тот же пост, мне нужно использовать составные/данные формы.
Проблема началась после обновления с PHP 5.3.x до PHP 5.4.4-14 (в комплекте с Debian Wheezy), те же сценарии хорошо работают с тестовым сервером PHP 5.3.
- Все мои документы сохранены в UTF-8 и имеют теги
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
. - Я тестировал с разные браузеры на разных компьютерах
- mb_detect_encoding() определяет отправленную строку как UTF-8
- Я попробовал
AddDefaultCharset utf-8
для конфигурации Apache.
Здесь вы можете протестировать мои сценарии, вы можете скопировать/вставить следующую строку с турецкими символами (например, строка: öçşipğopüp)
Http://sa.chelona.com.tr/haber-ekle.html
Я также нашел связанный с этим вопрос в Текст UTF-8 искажается, когда форма публикуется как составные/данные формы в PHP, но он рекомендует переустановка apache/php, и это невозможно в моей ситуации. Это известная ошибка PHP/Apache?
11 answers
Выполните простое преобразование из UTF-8
в Турецкий алфавит ISO-8859-9, и проблема должна быть решена
iconv('UTF-8', "ISO-8859-9", $string);
Пример ввода : öçşipğopüp
Пример формы:
<form method="post" enctype="multipart/form-data" action ="self.php">
<input type="text" name="hello" />
<input type="submit" name="test" />
</form>
Простой поддон:
var_dump($_POST['hello'],iconv('UTF-8', "ISO-8859-9", $_POST['hello']));
Вывод
string 'öçşipğopüp ' (length=16)
string 'öçþipðopüp ' (length=11)
Я пишу это, чтобы ответить на свой собственный вопрос... Я надеюсь, что это поможет кому-то еще...
Если вы используете PHP 5.4.x, установка mbstring.http_input с "auto" на "pass" может решить вашу проблему.
Моя версия php 5.4.45, и изменение mbstring.http_input
с auto
на pass
работает очень хорошо. В файле php.ini
значение по умолчанию - pass. Для получения более подробной информации об этой переменной вы можете посмотреть здесь.
Вам следует попытаться переустановить ваш wamp или xampp или ваш apache и php. и запустить свой код на чужой машине с той же версией php. если этот код запускается, попробуйте выяснить, почему он не работает на вашем сервере или проверьте расширение file_upload в вашем php.
Если раскомментирование строки кодировки по умолчанию в php.ini что-то сделает, это будет легко исправить. не забудьте отказаться от apache после изменения.
Я не думаю, что вам следует использовать mb_detect_encoding для определения кодировки в этом случае.
Если вы должны использовать его, то, возможно, вам нужно установить порядок обнаружения, чтобы убедиться, что UTF-8 находится выше по списку, см. http://www.php.net/manual/en/function.mb-detect-order.php
Вы установили кодировку принятия формы в UTF-8; вы установили исходную страницу в UTF-8: все текущие браузеры будут отправлять UTF-8. HTML 5 определяет этот FWIW: http://www.w3.org/TR/2011/WD-html5-20110405/association-of-controls-and-forms.html#multipart-form-data
Строка будет UTF-8, не пытайтесь ее преобразовать, и все будет в порядке.
Но если вы опубликуете часть своего PHP-кода, то, возможно, станет ясно, что вы пытаетесь сделать и что идет не так...
Извините, это скорее идея для обходного пути, чем реальное решение, однако, если все традиционные методы не сработали, и вы ничего не можете переустановить, попробуйте выполнить преобразование из кодовых точек UTF8. Что-то вроде использования кодировки base64 перед отправкой, а затем декодирования при получении. Или преобразуйте в шестнадцатеричную строку и декодируйте после получения.
Вам нужно добавить заголовки в PHP и HTML, например, в нижнем регистре:
<?php header('content-type: text/html; charset=utf-8'); ?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form method="post" enctype="multipart/form-data" action ="self.php">
...
</form>
</body>
</html>
Помните: Сохраняйте все php и html файлы в utf-8 без спецификации.
Ваша страница с примером выглядит правильно, и шаги, которые вы предприняли, похоже, охватывают большинство важных моментов, хотя я бы проверил еще одну вещь. Вы написали, что данные хранятся в базе данных MySQL с кодировкой UTF-8, но это не обязательно означает, что объект подключения PHP также работает с этой кодировкой.
// tells the mysqli connection to deliver UTF-8 encoded strings.
$db = new mysqli($dbHost, $dbUser, $dbPassword, $dbName);
$db->set_charset('utf8');
// tells the pdo connection to deliver UTF-8 encoded strings.
$dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8";
$db = new PDO($dsn, $dbUser, $dbPassword);
В приведенных выше примерах показано, как установить кодировку для SQLI или PDO. Подготовка объекта подключения таким образом делает вас независимым от базы данных конфигурация, при необходимости соединение даже преобразует возвращенные/отправленные данные.
Чтобы проверить это на своей странице, убедитесь, что кодировка установлена, прежде чем вставлять/запрашивать базу данных.
Mb_интернальное_кодирование ("UTF-8");
Добавьте этот код перед вашей строкой..
После долгих попыток распаковать() и предложений из ответов здесь я обнаружил ловушку, и, возможно, у вас та же причина проблемы с кодировкой.
Все, что мне нужно было сделать, это создать htmlentities, явно используя utf-8:
htmlentities(stripslashes(trim(rtrim($_POST['title']))), ENT_COMPAT, "utf-8");
Это для php 5.2.xx