Вопрос по encoding, php – проблема кодирования php htmlentities

1

У меня есть пользовательский ввод и использую htmlentities () для преобразования всех сущностей. Однако, похоже, есть какая-то ошибка. Когда я набираю

<code>ääää öööö üüüü ääää
</code>

я получил

<code>&Atilde;&curren;&Atilde;&curren;&Atilde;&curren;&Atilde;&curren; &Atilde;&para;&Atilde;&para;&Atilde;&para;&Atilde;&para; &Atilde;&frac14;&Atilde;&frac14;&Atilde;&frac14;&Atilde;&frac14; &Atilde;&curren;&Atilde;&curren;&Atilde;&curren;&Atilde;&curren;
</code>

Который выглядит так

& # Xc3; & # xa4; & # xc3; & # xa4; & # xc3; & # xa4; & # xc3; & # xa4; & # Xc3; & # XB6; & # xc3; & # XB6; & # xc3; & # XB6; & # xc3; & # XB6; & # Xc3; & # XBC; & # xc3; & # XBC; & # xc3; & # XBC; & # xc3; & # XBC; & # Xc3; & # xa4; & # xc3; & # xa4; & # xc3; & # xa4; & # xc3; & # xa4;

Что я делаю неправильно? Код действительно только такой:

<code>$post=htmlentities($post);
</code>

РЕДАКТИРОВАТЬ 1

Вот еще немного кода, который я использую для целей форматирования (в них есть несколько полезных функций):

<code>    //Secure with htmlentities (mysql_real_escape_string() comes later)
    $post=htmlentities($post);

    //Strip obsolete white spaces
    $post = preg_replace("/ +/", " ", $post);

    //Detect links
    $pattern_url='~(?>[a-z+]{2,}://|www\.)(?:[a-z0-9]+(?:\.[a-z0-9]+)[email protected])?(?:(?:[a-z](?:[a-z0-9]|(?<!-)-)*[a-z0-9])(?:\.[a-z](?:[a-z0-9]|(?<!-)-)*[a-z0-9])+|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?:/[^\\/:?*"<>|\n]*[a-z0-9])*/?(?:\?[a-z0-9_.%]+(?:=[a-z0-9_.%:/+-]*)?(?:&[a-z0-9_.%]+(?:=[a-z0-9_.%:/+-]*)?)*)?(?:#[a-z0-9_%.]+)?~i';
    preg_match_all($pattern_url, $post, $matches); 
    for ($i=0; $i < count($matches[0]); $i++)
    {
        if(substr($matches[0][$i],0,4)=='www.')
        $post = str_replace($matches[0][$i],'http://'.$matches[0][$i],$post);
    }
    $post = preg_replace($pattern_url,'<a target="_blank" href="\\0">\\0</a>',$post);

    //Keep line breaks (more than one will be stripped above)
    $post=nl2br($post);

    //Remove more than one linebreak
    $post=preg_replace("/(<br\s*\/?>\s*)+/", "<br/>", $post);

    //Secure with mysql_real_escape_string()
    $post=mysql_real_escape_string($post);
</code>
Когда вы говорите «действительно только это» Вы можете поделиться остальным? Я не вижу ничего плохого в вашем PHP, поэтому проблема может быть в другом месте. Steve Robbins
@stevether Пожалуйста, смотрите вопросы редактировать. weltschmerz

Ваш Ответ

2   ответа
7

Вы должны вручную указать кодировку (UTF-8) заhtmlentities():

echo htmlentities("ääää öööö üüüü ääää", null, "UTF-8");

Выход:

ääää öööö üüüü ääää
Error: User Rate Limit Exceeded weltschmerz
Error: User Rate Limit Exceededhtmlentities("string", ENT_COMPAT | ENT_HTML401, "UTF-8")
Error: User Rate Limit Exceeded weltschmerz
2

важно, чтобы 3-й параметр htmlentities соответствовал набору символов, использующему сообщение. Я полагаю, вы НЕ отправляете utf8, так как это по умолчанию в htmlentities

в PHP

 $post = htmlentities ( $post, ENT_COMPAT, 'ISO-8859-1')  // or whatever  

сообщить

 <form action="your.php" accept-charset="ISO-8859-1">

во всяком случае, на самом деле я рекомендую вам использовать utf8

Error: User Rate Limit Exceeded weltschmerz

Похожие вопросы