php - 带unicode的htmlspecialchars

时间:2011-04-04 10:34:13

标签: php

    $string = "Główny folder grafik<p>asd nc</p>";

echo htmlspecialchars($string);

在实时网站上

G&#322;ówny folder grafik<p>asd nc</p>

on local

Główny folder grafik<p>asd nc</p>

什么是问题?我希望在实时网站上运行结果看起来像本地

4 个答案:

答案 0 :(得分:1)

htmlspecialchars()接受其他参数 - 第三个是charset。

尝试指定第三个参数。

答案 1 :(得分:1)

您需要在htmlspecialchars()函数中添加额外的参数。以下应该有效:

htmlspecialchars($string, ENT_QUOTES, "UTF-8");

答案 2 :(得分:0)

您可能希望将关于charset的可选参数传递给htmlspecialchars,默认情况下为ISO-8859-1。

答案 3 :(得分:0)

如果您需要翻译所有关联命名实体的字符串,请改用 htmlentities(),该功能在所有方面都与 htmlspecialchars() 相同,除了 htmlentities() 所有具有 HTML 字符实体等效项的字符都被翻译成这些实体。

但即使是 htmlentities() 也不会对所有 unicode 字符进行编码。它编码它可以[所有 latin1] 的内容,而其他的则通过(例如`Љ)。

此函数参考 ansii 表来自定义包含/省略您想要/不想要的字符。

(注意:肯定没那么快)

/**
 * Unicode-proof htmlentities.
 * Returns 'normal' chars as chars and weirdos as numeric html entites.
 * @param  string $str input string
 * @return string      encoded output
 */
function superentities( $str ){
    // get rid of existing entities else double-escape
    $str = html_entity_decode(stripslashes($str),ENT_QUOTES,'UTF-8');
    $ar = preg_split('/(?<!^)(?!$)/u', $str );  // return array of every multi-byte character
    foreach ($ar as $c){
        $o = ord($c);
        if ( (strlen($c) > 1) || /* multi-byte [unicode] */
            ($o <32 || $o > 126) || /* <- control / latin weirdos -> */
            ($o >33 && $o < 40) ||/* quotes + ambersand */
            ($o >59 && $o < 63) /* html */
        ) {
            // convert to numeric entity
            $c = mb_encode_numericentity($c,array (0x0, 0xffff, 0, 0xffff), 'UTF-8');
        }
        $str2 .= $c;
    }
    return $str2;
}