gpt4 book ai didi

PHP将日语字符串作为其他内容插入到utf8表中,但仍然成功读取

转载 作者:行者123 更新时间:2023-11-29 14:25:36 24 4
gpt4 key购买 nike

为什么 PHP 将日语等字符存储在支持 utf8 的 MySQL 表中,但却成功地从 MySQL 中将值作为原始字符串读取出来?

例如

$db = new mysqli("localhost", "user", "pwd", "test");
$sql = "INSERT INTO testtable(name) VALUES ('ボーナスエリア');

从工作台中,它已作为 ディション 插入表中我不知道编码/映射如何或在什么级别发生。

用 PHP 读回它会得到正确的字符串 ボーナスエリア正在网页上显示。为什么以及如何运作?

更新感谢迄今为止所有的评论。不仅仅是好奇,它实际上给我带来了一个问题,想要从另一个源插入字符,即 Java,它通过 jdbc 正确插入 CJK 字符。这会导致 PHP 读回它们并显示为 ??????

时出现问题

任何人都可以证明什么编码将给定的字符转换为数据库查看器中显示的内容吗?

更新2我的浏览器(与此问题无关,因为在显示之前值为 ????)是 firefox,编码设置为 Western ISO-8859-1。我可以看到 ?????? 旁边的日语字符正确显示人物。矛盾的是,出现的角色是???在数据库查看器中正确显示。

浏览器设置

browser settings

网页片段

web page snippet

最佳答案

PHP 主要将文本视为任意二进制数据。这意味着在这些情况下,两个错误相互抵消是很常见的。

例如,如果您在源文件中写入 ボーナスエeria 并将其保存为 UTF-8,则 PHP 看到的字节是 \xe3\x83\x9c\xe3\x83\xbc... 这就是它的工作原理。您可以将该字符串传递给数据库客户端库,就像这里的 mysqli 一样,如果幸运的话,当您稍后从数据库取回文本时,客户端库将返回完全相同的字节PHP。 独立于数据库实际存储数据的方式。

这里发生的情况似乎是数据库客户端库被配置为根据 latin1 解释 PHP 传递给它的数据,这意味着它解释字节 \xe3\x83\x9c... 作为字符 ã¡...,这就是数据库将存储的内容。当您读取数据时,会发生同样的事情:客户端从数据库获取字符 ã¡...,并且由于它设置为以 latin1 对其进行编码,因此它将返回 \xe3\x83\x9c... 到 PHP。这解释了如何在数据库中拥有 mojibake,但 PHP 应用程序似乎仍然可以正常工作。

当然,让数据库以可读的格式存储文本会更好。为此,您必须将客户端编码(请参阅 mysqli_set_charset )和数据库列编码(请参阅 MySQL 文档)设置为 utf8

关于PHP将日语字符串作为其他内容插入到utf8表中,但仍然成功读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11034688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com