从查询字符串中读写UTF-8的PHP方法

3

我需要能够在查询字符串中传递音乐的升降符号,并在utf-8浏览器中显示。使用html实体表示升降符号可以轻松地进行显示。

Flat -  ♭
Sharp - ♯

这些数据的传递让我感到困惑。

我们以B♭和HTML实体表示方法为例:
它的HTML实体表示为:B♭

客户端
为了传递它,我进行URL编码:B%26%239837%3B
然后将其放入查询字符串中:?lookup=B%26%239837%3B

服务器端
读取它:$r = urldecode($_GET['lookup']);
显示它:echo $r; 只得到B

接着我尝试:

读取它:$r = $_GET['lookup'];
显示它:echo $r; 只得到B

同时原始请求只显示B。

如何正确地在查询字符串中传递此类型的URL编码HTML实体?


1
当它填充 $_GET 时,PHP 会为您解码 URL。您不需要再次解码。 - Marc B
无论哪种方式,都能得到相同的结果...奇怪 - Slinky
PHP代码唯一需要做的事情就是 $r = html_entity_decode($_GET['lookup'], ENT_QUOTES,'UTF-8');。或者如果您使用utf-8,则不使用HTML实体,而是在文本中使用纯值和url_encoded值(B♭ => B%E2%99%AD)。 - Wrikken
对于良好结构化问题,请给予+1。 - raidenace
2个回答

2

如果您使用实际的UTF-8编码字符而不是HTML实体,则会更加简单明了。

B%26%239837%3BB♭ 的 URL 编码版本。B♭ 是 "B♭" 的 HTML 实体表示,它并不是"UTF-8"。你需要的是 B%E2%99%AD,这是 "B♭" 的 URL 编码 UTF-8 表示。如果您在那个上执行 $_GET['lookup'],您将得到 UTF-8 编码的字符串 "B♭"。

您应该从头到尾使用 UTF-8 进行处理。有关详细信息,请参见Handling Unicode Front To Back In A Web App,可能需要查看What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text


我并不认同每个程序员都需要了解 utf-8 的观点。除非你特别需要在字符集之间进行转换,否则只需在所有地方使用 utf-8 即可。http://www.utf8everywhere.org/ - Danack
当然,这仍意味着你需要知道UTF-8是什么以及PHP如何处理它。该文章还介绍了有关字符集的知识,而不是每个人都需要知道的UTF-8的内容。 - deceze

0

试试这个:

$bSharp = "&#9839";
echo "<a href='filename.php?bSharp=".urlencode(htmlentities($bSharp))."'>pass it</a>";


//filename.php
echo html_entity_decode(urldecode($_GET['bSharp']));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接