Как отображать специальные символы в PHP

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

$string = "<p>Résumé</p>";

Я хочу напечатать или повторить строку, но вывод будет возвращен <p>R�sum�</p>. Поэтому я стараюсь htmlspecialchars() или htmlentities() выходы &lt;p&gt;R&eacute;sum&eacute;&lt;p&gt; и браузер отображает &lt;p&gt;R&eacute;sum&eacute;&lt;p&gt;. Я хочу, чтобы он, очевидно, сделал следующее:

резюме

и я использую UTF-8:

header("Content-type: text/html; charset=UTF-8");

что я пропустила? Почему echo и печать вывод для любого специального символа? Чтобы уточнить, строка на самом деле является целым html-файлом, хранящимся в базе данных. Приложение реального мира-это не просто одна маленькая строка.

9 ответов


после Большого стука головой по столу у меня есть немного лучшее понимание проблемы, которую я хотел опубликовать для всех, у кого могла быть эта проблема.

в то время как набор символов UTF-8 будет отображать специальные символы на клиенте, сервер, с другой стороны, может быть не таким удобным и будет печатать специальные символы, такие как à и è as и .

чтобы убедиться, что ваш сервер будет печатать их правильно, нам ISO-8859-1 charset:

<?php
    /*Just for your server-side code*/
    header('Content-Type: text/html; charset=ISO-8859-1');
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"><!-- Your HTML file can still use UTF-8-->
        <title>Untitled Document</title>
    </head>
    <body>
        <?= "àè" ?>
    </body>
</html>

это будет печатать правильно:àè


Edit (4 года спустя):

теперь я немного лучше понимаю. Причина этого заключается в том, что клиенту (браузеру) сообщают Через ответ header(), чтобы ожидать ISO-8859-1 текстовый / html файл. (Как упоминали другие, вы также можете сделать это, обновив свой .ini или .htaccess файлы.) затем, как только браузер начнет анализировать этот файл в Дом, выход будет подчиняться любому <meta charset=""> правило, но держите ваши символы ISO в такте.


вы можете иметь смесь PHP и HTML в ваших файлах PHP... просто сделай что-нибудь подобное...

<?php
$string = htmlentities("Résumé");
?>

<html>
<head></head>
<body>
<p><?= $string ?></p>
</body>
</html>

это должно вывести Résumé именно так, как вы хотите.

если у вас нет коротких тегов, замените <?= $string ?> С <?php echo $string; ?>


поэтому я пытаюсь htmlspecialchars() или htmlentities (), который выводит резюме

и браузер отображает

в резюме.

Если у вас есть он работает, где он отображает Résumé с <p></p> теги вокруг него, а затем просто не преобразуйте абзац, только вашу строку. Затем абзац будет отображаться как HTML, и ваша строка будет отображаться внутри.


в PHP есть хорошая функция utf8_encode () чтобы решить эту проблему.

echo utf8_encode("Résumé");

//will output Résumé instead of R�sum�

Проверьте официальную страницу PHP.


$str = " тебя зовут О'Винс?";

// выходы: вас зовут О'Винс? echo stripslashes ($str);


это работает для меня:

создать/редактировать .htaccess файл с этими строками:

AddDefaultCharset UTF-8
AddCharset UTF-8 .php

если вы предпочитаете create / edit php.ini:

default_charset = "utf-8"

источники:


Попробуй Такое

вход:

<!DOCTYPE html>
<html>
<body>

<?php
$str = "This is some <b>bold</b> text.";
echo htmlspecialchars($str);
?>

<p>Converting &lt; and &gt; into entities are often used to prevent browsers from using it as an HTML element. <br />This can be especially useful to prevent code from running when users have access to display input on your homepage.</p>

</body>
</html>

выход:

This is some <b>bold</b> text.

Converting < and > into entities are often used to prevent browsers from using it as an HTML element. This can be especially useful to prevent code from running when users have access to display input on your homepage.

это работает для меня. Попробуйте это перед началом HTML. Надеюсь, это сработает и для вас.

<?php header('Content-Type: text/html; charset=iso-8859-15'); ?>
<!DOCTYPE html>

<html lang="en-US">
<head>

следующее работало для меня, когда в последнее время возникла аналогичная проблема:

$str = iconv('iso-8859-15', 'utf-8', $str);