PHP — Экранирование em тире

#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. Смотрите мой комментарий выше о том, что помогло. Спасибо за вашу помощь, Джон.