#php #forms #encoding
#php #формы #кодирование
Вопрос:
Я $_POST добавляю следующий заголовок из формы:
Google’s New Partner Android Update Initiative: Very Promising — Maybe; We’ll See
И на странице обработчика, если первое, что я делаю, это
echo "<pre>";
print_r($_POST);
die();
Я вижу:
Google’s New Partner Android Update Initiative: Very Promising — Maybe; We’ll See
Я понимаю, что существуют функции для преобразования символов amp; escape и их эквивалентов в HTML, но как я могу гарантировать, что это содержимое добавляется в $ _POST в правильной кодировке?
Приветствия,
Ответ №1:
не уверен, помогает ли это, но, похоже, кодировка UTF-8 была перепутана (управляющие символы кажутся мне несколько знакомыми …). Попробуйте вывести с помощью utf8_encode() или utf8_decode().
Комментарии:
1. Когда я размещаю utf8_decode (), что публикуется, я получаю «Новая партнерская инициатива Google по обновлению Android: очень многообещающая? Может быть; Посмотрим». Я больше спрашиваю, почему это изначально помещается в $ _POST в таком формате. Спасибо.
2. что произойдет, если вы попытаетесь вывести с помощью utf8_encode() ? Я думаю, проблема в том, что форма отправлена с неправильной кодировкой / типом содержимого. Попробуйте определить кодировку, которая используется вашим браузером. Альтернативно задается с помощью PHP
header('Content-type: text/html; charset=utf-8');
или HTML мета-тега:<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
3. Вывод с помощью utf8_encode() выводит исходную строку, которую я опубликовал в вопросе. У меня уже есть тег <meta http-equiv=»Content-Type» content=»text / html; charset = utf-8″ /> в форме
4. Может ли существовать набор http-заголовков, который имеет приоритет над meta-тегом? Попробуйте включить директиву PHP
header()
, которую я опубликовал в комментарии ранее. Может быть, это помогает? Вы также можете проверить mb_detect_encoding() , чтобы увидеть, какую кодировку использует ваш вывод.5. Добавление заголовка (‘Content-type: text / html; charset = utf-8’); на странице обработчика и тега <meta> в форме, казалось, сделало свое дело. Я также убедился, что параметры сортировки базы данных были в utf8_unicode_ci. При обратном отображении содержимого у меня также было несколько вызовов htmlentities () и stripslashes (), которые изменяли символы. Спасибо.
Ответ №2:
Как страница с формой, так и отображаемая страница должны использовать одну и ту же кодировку. Чтобы воспроизвести поведение, которое вы показываете, мне пришлось создать 2 страницы, одну форму, с
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
который размещен на странице без этого.
Если я помещаю мета-тег на обе страницы, он выводится правильно, если я удаляю его с обеих страниц, он выводится правильно.
Если это есть только в форме, вы получаете то, что опубликовали, и если это есть только на странице получения, вы получаете ? ‘s.
test.php
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<form method="post" action="test2.php">
<input type="text" name="string">
<input type="submit">
</form>
test2.php
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<?php
if(isset($_POST['string']))
{
echo "<pre>";
print_r($_POST['string']);
die();
}
?>
Если я вставлю вашу строку в поле ввода в test.php , нажмите отправить, я верну его должным образом в test2.php . Если я удалю первую строку test2.php Я понимаю поведение, которое вы описываете.
Комментарии:
1. И на моей странице формы, и на странице отображения есть этот тег, и я все еще вижу, что опубликовано. Тег находится в коде заголовка моего сайта, согласован на всех страницах
2. Я обновлю свой ответ примером, который я использовал. Посмотрите, возникает ли проблема в вашей комбинации браузер / сервер на моем примере, и если нет, возможно, что-то еще на вашей странице влияет на это.
3. Смотрите мой комментарий выше о том, что помогло. Спасибо за вашу помощь, Джон.