1

ユーザー入力があり、htmlentities()を使用してすべてのエンティティを変換します。ただし、バグがあるようです。入力すると

ääää öööö üüüü ääää

私は得る

ääää öööö üüüü ääää

このように見えます

ääääööööüüüüääää

私は何が間違っているのですか?コードは実際にはこれだけです:

$post=htmlentities($post);

編集1

これが私がフォーマットの目的で使用するいくつかのコードです(それらにはいくつかの便利な関数があります):

    //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]+)?@)?(?:(?:[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);
4

2 に答える 2

7

:のエンコーディング( UTF-8)を手動で指定する必要があります。htmlentities()

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

出力:

ääää öööö üüüü ääää
于 2012-05-10T17:23:47.920 に答える
2

htmlentitiesの3番目のパラメーターが、投稿を使用する文字セットと一致することが重要です。おそらく、utf8はhtmlentitiesのデフォルトであるため、送信していません。

PHPで

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

知らせる

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

とにかく、実際にはutf8を使用することをお勧めします

于 2012-05-10T17:34:55.480 に答える