HUH函数
你在这里混合API,mysql_*和mysqli_*不会混在一起。你应该坚持mysqli_(看起来你无论如何都是),mysql_*函数被弃用,并在PHP 7中完全删除。你的实际问题是某个地方的字符集问题。这里有几个指针,可以帮助您为您的应用程序获得正确的字符集。这套最开发PHP/MySQL应用程序时所面临的一般问题。全整个应用程序的属性必须设置为utf-8。将文档保存为UTF-8w/o BOM(如果您使用的是记事本+,它是Format -> Convert to UTF-8 w/o BOM)PHP和HTML中的标题应该设置为UTF-8。HTML(内部)
(标签):PHP(在文件顶部,在任何输出之前):header('Content-Type: text/html; charset=utf-8');连接到数据库后,将连接对象的字符集设置为utf-8,如下所示(在连接之后)mysqli_set_charset($conn, "utf8"); /* Procedural approach */$conn->set_charset("utf8"); /* Object-oriented approach */这是为了mysqli_*,也有类似的mysql_*和PDO(见这个答案的底部)。此外,请确保数据库和表设置为UTF-8,您可以这样做:ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;(任何已经存储的数据都不会转换成适当的字符集,因此您需要使用干净的数据库来完成这一操作,或者在出现字符中断时更新数据)。如果你用json_encode(),您可能需要应用JSON_UNESCAPED_UNICODE标志,否则它将特殊字符转换为它们的十六进制等价物。记住一切在整个代码管道中,需要设置为UFT-8,否则应用程序中可能会出现字符中断。除了这个列表之外,可能还有一些函数具有指定字符集的特定参数。手册会告诉你这一点(一个例子是htmlspecialchars()).对于多字节字符也有一些特殊的函数,例如:strtolower()不会降低多字节字符,因为您必须使用mb_strtolower(),看这个现场演示.附注1:注意到它在某个地方被注明为utf-8(用破折号),在某个地方utf8(没有它)。重要的是,您知道什么时候使用它,因为它们通常是不可互换的。例如,HTML和PHP希望utf-8,但MySQL没有。附注2:在MySQL中,“字符集”和“排序规则”不是一回事,请参阅编码和校对的区别?..不过,两者都应该设置为utf-8;一般来说,排序应该是utf8_general_ci或utf8_unicode_ci,见将军?箱子?Unicode?.附注3:如果使用的是emojis,则需要使用utf8mb4字符集而不是标准utf8,无论是在数据库中还是在连接中。HTML和PHP只会有UTF-8.设置UTF-8mysql_和PDOPDO:这是在对象的DSN中完成的。注意charset属性,$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");mysql_*这非常类似于mysqli_*,但它不以连接对象作为第一个参数。mysql_set_charset('utf8');