12
4

4 回答 4

18

看起来您在内部有 UTF-8 编码的字符串,PHP 正确输出它们,但您的浏览器无法自动检测编码(它决定使用 ISO 8859-1 或其他编码)。

最好的方法是通过发送相应的 HTTP 标头告诉浏览器正在使用 UTF-8 :

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

然后,您可以将其余代码保持原样,而不必对实体进行 html 编码或创建其他混乱。

如果需要,您可以使用标记在生成的 HTML 中另外声明编码:<meta>

  • <meta http-equiv=Content-Type content="text/html; charset=UTF-8">对于 HTML <=4.01
  • <meta charset="UTF-8">对于 HTML5

HTTP 标头优先于<meta>标记,但如果将 HTML 保存为 HD 然后在本地读取,则后者可能很有用。

于 2013-07-09T03:48:24.327 回答
12

我花了很多时间试图找到更好的方法来打印 unicode 代码的等效字符,但我发现的方法不起作用或者非常复杂。

也就是说,JSON 能够使用语法“\u[unicode_code]”来表示 unicode 字符,那么:

echo json_decode('"\u00e1"'); 

将打印等效的 unicode 字符,在这种情况下:á。

PD 注意单引号和双引号。如果你不把这两个都放了,那就不行了。

于 2014-10-30T16:28:16.453 回答
7
// PHP 7.0
var_dump(
    IntlChar::chr(0x2122),
    IntlChar::chr(0x1F638)
);

var_dump(
    utf8_chr(0x2122),
    utf8_chr(0x1F638)
);

function utf8_chr($cp) {

    if (!is_int($cp)) {
        exit("$cp is not integer\n");
    }

    // UTF-8 prohibits characters between U+D800 and U+DFFF
    // https://tools.ietf.org/html/rfc3629#section-3
    //
    // Q: Are there any 16-bit values that are invalid?
    // http://unicode.org/faq/utf_bom.html#utf16-7

    if ($cp < 0 || (0xD7FF < $cp && $cp < 0xE000) || 0x10FFFF < $cp) {
        exit("$cp is out of range\n");
    }

    if ($cp < 0x10000) {
        return json_decode('"\u'.bin2hex(pack('n', $cp)).'"');
    }

    // Q: Isn’t there a simpler way to do this?
    // http://unicode.org/faq/utf_bom.html#utf16-4
    $lead = 0xD800 - (0x10000 >> 10) + ($cp >> 10);
    $trail = 0xDC00 + ($cp & 0x3FF);

    return json_decode('"\u'.bin2hex(pack('n', $lead)).'\u'.bin2hex(pack('n', $trail)).'"');
}
于 2015-01-16T21:56:13.207 回答
7

尝试这个:

echo htmlentities("Uncharted: Drakes Fortune™ \n", ENT_QUOTES, "UTF-8");

来自: http: //php.net/htmlentities

于 2013-07-09T03:38:35.613 回答