gpt4 book ai didi

php - 复制后编码混淆

转载 作者:搜寻专家 更新时间:2023-10-30 23:45:22 24 4
gpt4 key购买 nike

我在不同的服务器上有两个 MySql 数据库。

我正在将内容从数据库 1 复制到数据库 2。

数据库 1

包含 UTF8_unicode_ci 中的所有内容
通过 php 的连接是使用 set_charset(utf8)

完成的

数据库 2

同1

复制:

我正在将内容从数据库 1 复制到数据库 2,如下所示:

内容打印在 JSONfile.php 文件中,带有 header('Content-type: application/json; charset=utf-8') 和 php json_encode ()

内容通过 php 使用 file_get_contents(JSONfile.php) 和 `json_decode()`` 获取。

然后保存到DATABASE 2

旁注:我没有其他方法可以在我使用的服务器上复制内容。不允许远程连接。

问题:

当我从 DATABASE 2 检索数据并显示它们时(总是使用 meta charset utf8),似乎出现了一些奇怪的符号,如下所示:

... autorizar la restauración de la pintura âLa Inmaculadaâ de Fran ...

注意:此字符串上的 mb_detect_encoding() 返回:UTF-8

只是为了尝试,我做了 utf8_decode() 并且它进入了:

... la restauración de la pintura �La Inmaculada� de ...

它修复了一些问题并将奇怪与非奇怪混合在一起。

所以,一定是哪里出了问题。

有找到错误的想法吗?

编辑:- 数据库 1 中的内容来源-

数据库 1 中的所有内容都是在不同网站上进行 SCRAPE 的结果。
使用 html meta charset utf8 打开网站时,所有的抓取都已完成。
一些来源有 &Xacute;实体,有些则没有。

编辑 2:

数据库 1 上转换为十六进制

Después de dos --> 4465737075c3a97320646520646f73

数据库 2 上转换为十六进制

Después de dos --> 4465737075c3a97320646520646f73 (同上)

所以问题不在于从一个数据库复制到另一个数据库。

我一直在调查,有一件很奇怪的事情。在数据库(两者)上,当我通过 phpMyAdmin 访问时,有一些字段显示正确的锐角,例如“camión”。但是在有问题的字段上它会显示编码,例如:Después

我不知道 phpMyAdmin 应该显示 utf8 格式还是人类可读的格式。但是同一张表的字段之间的这种差异肯定是发现问题的大门。

SHOW CREATE TABLE 返回:

CREATE TABLE `contents_data` (
`id` bigint(20) unsigned NOT NULL,
`title` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
`main_img` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
`data` text COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `ContentsDataIdFK` FOREIGN KEY (`id`) REFERENCES `contents` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

编辑

在带有字符串“Alcázar”的字段上执行 col(HEX) 返回“416c63e17a6172”

非常好奇的东西:

在上面显示的表格中,字段 VARCHAR 正确编码重音符号,而字段 TEXT 在 ALL ROWS 中引起了麻烦!

More infos: See the change in accents, for fields VARCHAR and TEXT

列是:“VARCHAR”和“TEXT”(更多信息参见上面的 CREATE TABLE 代码)

注意:无论抓取的来源如何,每一行都会发生同样的事情。

最佳答案

当您将 set_charset 设置为(或默认为)latin1 并且该列的定义为 CHARACTER SET 时,您可能存储了“o-acute” latin1.

案例 1C3B3(o-acute 的 utf8 十六进制)转换为 Ã(latin1 中的十六进制 C3)和 ³(B3 in latin1).

SELECT col, HEX(col) ... 看看现在有什么。同时执行 SHOW CREATE TABLE 以获取 CHARACTER SET

(编辑)在这种情况下,执行2-step ALTER , 这有点像

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

其中的长度足够大,而其他 ... 列中已经有任何其他内容(NULL 等)。

类似地,TEXT -> BLOB -> TEXT

如果 col 在任何索引中,您可能希望在第一个 ALTERADD INDEXDROP INDEX > 在第二个。 (这是为了提高效率并可能避免索引限制。)

情况 2 或者它可能是“双重编码”——十六进制不是 C3B3,而是更长的东西。

一旦确定是哪种情况,我们就可以讨论如何处理。

Blog with further discussion .

关于php - 复制后编码混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29459324/

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