问问题
36796 次
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 回答