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?

Author: Community, 2013-06-11

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)
 5
Author: Baba, 2013-06-27 16:51:11

Я пишу это, чтобы ответить на свой собственный вопрос... Я надеюсь, что это поможет кому-то еще...

Если вы используете PHP 5.4.x, установка mbstring.http_input с "auto" на "pass" может решить вашу проблему.

 3
Author: she hates me, 2014-03-08 23:30:16

Моя версия php 5.4.45, и изменение mbstring.http_input с auto на pass работает очень хорошо. В файле php.ini значение по умолчанию - pass. Для получения более подробной информации об этой переменной вы можете посмотреть здесь.

 1
Author: Virginia Kama, 2016-12-08 00:56:28

Вам следует попытаться переустановить ваш wamp или xampp или ваш apache и php. и запустить свой код на чужой машине с той же версией php. если этот код запускается, попробуйте выяснить, почему он не работает на вашем сервере или проверьте расширение file_upload в вашем php.

 0
Author: Sachin, 2013-06-30 19:28:53

Если раскомментирование строки кодировки по умолчанию в php.ini что-то сделает, это будет легко исправить. не забудьте отказаться от apache после изменения.

 0
Author: Jacer Omri, 2013-07-01 08:31:10

Я не думаю, что вам следует использовать 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-кода, то, возможно, станет ясно, что вы пытаетесь сделать и что идет не так...

 0
Author: George Lund, 2013-07-01 17:03:16

Извините, это скорее идея для обходного пути, чем реальное решение, однако, если все традиционные методы не сработали, и вы ничего не можете переустановить, попробуйте выполнить преобразование из кодовых точек UTF8. Что-то вроде использования кодировки base64 перед отправкой, а затем декодирования при получении. Или преобразуйте в шестнадцатеричную строку и декодируйте после получения.

 0
Author: Neuticle, 2013-07-03 02:20:17

Вам нужно добавить заголовки в 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 без спецификации.

 0
Author: e-info128, 2013-07-03 13:46:25

Ваша страница с примером выглядит правильно, и шаги, которые вы предприняли, похоже, охватывают большинство важных моментов, хотя я бы проверил еще одну вещь. Вы написали, что данные хранятся в базе данных 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. Подготовка объекта подключения таким образом делает вас независимым от базы данных конфигурация, при необходимости соединение даже преобразует возвращенные/отправленные данные.

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

 0
Author: martinstoeckli, 2013-07-03 15:07:57

Mb_интернальное_кодирование ("UTF-8");

Добавьте этот код перед вашей строкой..

 0
Author: ganesan, 2014-02-24 14:21:49

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

Все, что мне нужно было сделать, это создать htmlentities, явно используя utf-8:

htmlentities(stripslashes(trim(rtrim($_POST['title']))), ENT_COMPAT, "utf-8");

Это для php 5.2.xx

 0
Author: Phaiax, 2015-06-19 11:28:54