我遇到了一个问题,我认为它与unicode文本有关。当用户输入具有unicode项目符号字符的字符串时,mysql无法保存该字段(尽管可以使用其他更新查询)。以下是我一直试图解决它的方式。删除Unicode符号
$str = "· Close up the server";
$str = preg_replace("\u2022", "•", $str);
......然而,这仍然没有工作。
我遇到了一个问题,我认为它与unicode文本有关。当用户输入具有unicode项目符号字符的字符串时,mysql无法保存该字段(尽管可以使用其他更新查询)。以下是我一直试图解决它的方式。删除Unicode符号
$str = "· Close up the server";
$str = preg_replace("\u2022", "•", $str);
......然而,这仍然没有工作。
这里有很多事情可能会出错,因为数据库,表单提交和源代码字符串文字都涉及。我假设你想要使用UTF-8,因为在使用json_
或接受超过200个不同的字符时,使用其他任何典型编码(CP1252,Latin1)将会导致错误。
首先要做的是删除任何类型的转换等代码,旨在试图解决编码问题。如utf8_encode
,htmlentitites
,*_replace
..不管。
源编码。
$str = "· Close up the server";
在编写上述内容时,需要使用UTF-8对PHP源文件进行物理编码。如果你在Windows上,你必须明确地做或配置它。在Windows上,UTF-8不会发生奇迹般的现象。
表单提交
当用户提交表单,有效载荷将在任何编码,你声明的页面是。你可以像这样把它声明:
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。
Unicode转义序列\uxxxx
或或\Uxxxxxxxx
在PHP不受支持。
\u2022
是UTF-16
十六进制编码为“子弹”。不是UTF-8
。
您可能还想要SET NAMES 'UTF-8';
或在打开数据库之前更改字符集。
@ficuscr我不认为缺乏理解值得赞扬。如果OP不缺乏理解力,他就不会首先提出问题。当有人有问题时,通常是因为他们“缺乏了解”。按照这个逻辑,我们应该减少每个问题的答案,因为他们要求答案,这表明“缺乏了解”。 –
@ SkeetsO'Reilly完全不记得这一点。不知道我是否指另一个答案?谢谢。 – ficuscr
你试过'$ str = preg_replace(“·”,“•”,$ str);'? – Vladimir
你试过'$ str = htmlentities($ str)'吗? – GolezTrol
@Vladimir有一个点 – samayo