字符编码失败,为什么\xBD在PHP+;HTML

字符编码失败,为什么\xBD在PHP+;HTML,php,utf-8,character-encoding,Php,Utf 8,Character Encoding,我只是想更好地理解字符编码,所以我正在做一些测试 我有一个保存为UTF-8的PHP文件,如下所示: <?php declare(encoding='UTF-8'); header( 'Content-type: text/html; charset=utf-8' ); ?><!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Test

我只是想更好地理解字符编码,所以我正在做一些测试

我有一个保存为UTF-8的PHP文件,如下所示:

<?php
declare(encoding='UTF-8');

header( 'Content-type: text/html; charset=utf-8' );
?><!DOCTYPE html>

<html>

<head>
    <meta charset="UTF-8" />
    <title>Test</title>
</head>

<body>
    <?php echo "\xBD"; # Does not work ?>
    <?php echo htmlentities( "\xBD" ) ; # Works ?>
</body>

</html>

试验
页面本身显示以下内容:

问题的要点是,我的web应用程序有一系列字符编码问题,人们从Outlook或Word复制和粘贴字符,字符被转换成菱形问号(这些问号有真实姓名吗?)

我正在尝试学习如何确保在页面加载时(基本上是
$\u GET
$\u POST
,以及
$\u REQUEST
),所有输入都转换为UTF-8,并且所有输出都使用适当的UTF-8处理方法完成



我的问题是:为什么我的页面显示了第一个echo的问号,有人有关于在PHP中创建UTF-8安全web应用程序的任何其他信息吗?

0xBD不是有效的UTF-8。如果要在UTF-8中编码“½”,则需要使用0xC2 0xBD

>>> print '\xc2\xbd'.decode('utf-8')
½
如果要使用另一个字符集的文本(本例中为拉丁语-1),则需要先使用各种iconv或mb函数将其转换为UTF-8

此外:


\xBD
作为utf8无效您想要的是
\xC2\xBD
,问号是应用程序用什么替换无效的代码点,因此如果您在utf8文本中看到它不是utf8或已损坏

$ charinfo �
U+FFFD REPLACEMENT CHARACTER