1

我有一个我认为与 unicode 文本有关的问题。当用户输入具有 unicode 项目符号字符的字符串时,mysql 无法保存该字段(尽管更新查询的其余部分有效)。这就是我一直在尝试处理它的方式。

$str = "· Close up the server";

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

...但是这仍然不起作用。

4

2 回答 2

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转义序列\uxxxxor 。\uhhhh\ullll\Uxxxxxxxx

于 2012-12-20T18:11:43.617 回答
2

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

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

于 2012-12-20T17:32:49.240 回答