我有一个我认为与 unicode 文本有关的问题。当用户输入具有 unicode 项目符号字符的字符串时,mysql 无法保存该字段(尽管更新查询的其余部分有效)。这就是我一直在尝试处理它的方式。
$str = "· Close up the server";
$str = preg_replace("\u2022", "•", $str);
...但是这仍然不起作用。
这里很多事情都可能出错,因为数据库、表单提交和源代码字符串文字都涉及到。我假设您想使用 UTF-8,因为对于任何其他典型编码(CP1252、Latin1),当您想要使用json_
或接受超过 200 个不同的字符时,您将被搞砸。
首先要做的是删除任何类型的转换等代码,这些代码是为了尝试修复编码问题而编写的。比如utf8_encode
, htmlentitites
, *_replace
.. 随便什么。
源编码。
$str = "· Close up the server";
在编写上述内容时,PHP 源文件需要以 UTF-8 进行物理编码。如果您在 Windows 上,则必须明确执行或配置此操作。UTF-8 在 Windows 上不会神奇地发生。
表单提交
当用户提交表单时,有效负载将采用您声明页面的任何编码。您可以像这样声明它:
header("Content-Type: text/html; charset=utf-8");
但实际上任何人都可以向您的服务器提交任意字节,因此您应该在继续之前验证输入是否为 UTF-8。mb_check_encoding
很好。
数据库
由于此时您的数据以 UTF-8 格式输入,因此您的输入字符串采用 UTF-8 格式。您必须在连接到数据库后通过指定连接编码来指定它。
mysql_set_charset("utf8"); //After making the connection, and before any queries
//or $mysqli->set_charset( "utf8");
这使得数据库以 UTF-8 读取您的输入,并以 UTF-8 对其输出进行编码。您还希望将列/表/数据库也设置为 UTF-8。
PHP 不支持Unicode转义序列\uxxxx
or 。\uhhhh\ullll
\Uxxxxxxxx
\u2022
是UTF-16
“子弹”的十六进制编码。不是UTF-8
。
您可能还想SET NAMES 'UTF-8';
在打开数据库之前更改字符集。