【发布时间】:2018-05-30 18:07:41
【问题描述】:
我无法解决这个问题,我快疯了。
JSON_encode() 将错误:Malformed UTF-8 characters, possibly incorrectly encoded 投射到一组 10k 记录中的少数记录(2 或 3)上。
但是,这似乎很难解决。
- mysql 已经是 utf8mb4 无处不在(数据库、表、列和排序规则)
- php 是 7.2,当然是 utf8
- apache 默认字符集是 utf8(但是错误是在 PHP 级别抛出的)。
我还可以在简单的 HTML 调试页面中打印以正确筛选 PHP 中的记录,而不会出现问题。但是,如果我尝试将其编码为 JSON,则会出现错误。
我发现这些记录是从 CVS 导入的,可能绕过了清理程序。奇怪的是,整个 CSV 文件被解析为:
$this->encoding = mb_detect_encoding($source,mb_detect_order(),true);
if ($this->encoding!="" && $this->encoding!="UTF8") {
$source = iconv($this->encoding, "UTF-8", $source);
}
由于隐私(和 GDPR),我无法发布任何完整的损坏数据。 但是我成功提取了一个似乎是损坏的部分:
RESIDENCE �PRINCIPE
更新
我尝试获取这些损坏字符的位码。这就是我发现的。
在 ASCII 中使用简单的本机函数 str_split 和 ord 这些字符是:
'�' 160
我也想在 utf8 中找到位码,所以我在 PHP.net http://php.net/manual/en/function.ord.php#109812 上找到了这个有用的函数 它试图找到 MultiByteStrings 的位码。它给了我:
-2096
哪个是.......负数?
【问题讨论】:
-
你要给我们看一个“损坏”数据的例子吗?
-
我唯一的损坏数据示例是电汇转账记录,我无法在 stackoverflown 上发布这些详细信息。抱歉(您知道 GDPR)。
-
谁能告诉我为什么人们应该对这样的问题投反对票?因为真的这似乎只是为了做坏事。
-
您正在从数据库中获取数据?您是否将数据库连接编码设置为
utf8mb4?注意:不是列排序规则/字符集,是连接编码。 -
正如我所写:mysql 已经是 utf8mb4 无处不在(数据库、表、列和排序规则)