使用 PHP 处理 GET 参数中的 unicode 值

tak*_*eek 5 php unicode encoding utf-8

我的服务器上有以下测试脚本:

<?php
echo "Test is: " . $_GET['test'];
?>
Run Code Online (Sandbox Code Playgroud)

如果我使用类似example.com/script.php?test=?(? 是多字节字符)的 url 调用它,则结果页面如下所示:

测试是:É¿

如果我尝试对 $_GET['test'] 中的值执行任何操作,例如将其保存为 mysql 数据库,我也会遇到同样的问题。我需要做什么才能让 PHP 正确处理这个值?

Pau*_*xon 4

您是否告诉用户代理您的 HTTP 响应是 UTF-8?

header ('Content-type: text/html; charset=utf-8');
Run Code Online (Sandbox Code Playgroud)

您可能还想确保您的 HTML 标记也声明了编码,例如

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Run Code Online (Sandbox Code Playgroud)

对于您的数据库,您的表和 mysql 客户端设置是否设置为 UTF-8?如果您使用 mysql 命令行客户端检查数据库,您的终端环境是否设置为支持 UTF-8?

简而言之,您必须检查每一步:从原始源数据、涉及它的代码、保留它的存储系统以及用于显示和调试它的工具。

  • 如果文档存储在另一个检索系统中,则原始 HTTP 标头将丢失 - 例如,如果将 HTML 保存到本地硬盘。 (2认同)
  • 我只想说“因为你可以”,但除此之外可能还有更多的理由:)它允许你做的一件事是通过 HEAD 请求探测请求的内容类型。 (2认同)
  • 小睡一会儿后,您可能会对 http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html 感兴趣,了解有关 mysql\_set\_charset() 的作用及其原因的更多信息使用 mysql\_query() 时,`SET NAMES 'utf8'` 并不是全部(它不会通知客户端库有关字符编码的更改,这在极少数情况下可能会导致 mysql\_real\ 的错误结果) _escape\_string())。我猜想,使用准备好的语句(mysqli、pdo)时,“SET 名称”是安全的。 (2认同)