我遇到了一个我认为与unicode文本有关的问题。当用户输入具有unicode项目符号字符的字符串时,mysql无法保存该字段(尽管更新查询的其余部分仍可正常工作)。以下是我一直试图解决的问题。
$str = "· Close up the server";
$str = preg_replace("\u2022", "•", $str);
......但是这仍然不起作用。
答案 0 :(得分:4)
这里有很多东西可能出错,因为数据库,表单提交和源代码字符串文字都涉及到了。我假设您要使用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
或\uhhhh\ullll
或\Uxxxxxxxx
。
答案 1 :(得分:2)
\u2022
是“Bullet”的UTF-16
十六进制编码。不是UTF-8
。
在打开数据库之前,您可能还需要SET NAMES 'UTF-8';
或更改字符集。