2012-12-20 89 views
1

我遇到了一个问题,我认为它与unicode文本有关。当用户输入具有unicode项目符号字符的字符串时,mysql无法保存该字段(尽管可以使用其他更新查询)。以下是我一直试图解决它的方式。删除Unicode符号

$str = "· Close up the server";

$str = preg_replace("\u2022", "•", $str); 

......然而,这仍然没有工作。

+0

你试过'$ str = preg_replace(“·”,“•”,$ str);'? – Vladimir

+0

你试过'$ str = htmlentities($ str)'吗? – GolezTrol

+0

@Vladimir有一个点 – samayo

回答

4

这里有很多事情可能会出错,因为数据库,表单提交和源代码字符串文字都涉及。我假设你想要使用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不受支持。

2

\u2022UTF-16十六进制编码为“子弹”。不是UTF-8

您可能还想要SET NAMES 'UTF-8';或在打开数据库之前更改字符集。

+0

@ficuscr我不认为缺乏理解值得赞扬。如果OP不缺乏理解力,他就不会首先提出问题。当有人有问题时,通常是因为他们“缺乏了解”。按照这个逻辑,我们应该减少每个问题的答案,因为他们要求答案,这表明“缺乏了解”。 –

+0

@ SkeetsO'Reilly完全不记得这一点。不知道我是否指另一个答案?谢谢。 – ficuscr