我正在使用json_encode($data)
转换数据数组,其中有一个字段包含俄语字符。
我使用了mb_detect_encoding()
来显示该字段的编码格式,结果显示为UTF-8。
我认为,json编码失败是由于其中包含一些类似于"ра▒"的非法字符。我尝试对数据使用utf8_encode
,它可以跳过该错误,但此时数据的外观已经不正确了。
针对这个问题应该怎么办?
即使大部分字符是UTF-8,如果存在一些非UTF-8字符,则会出现此问题。这将删除任何非UTF-8字符,然后它就正常工作了。
$data['name'] = mb_convert_encoding($data['name'], 'UTF-8', 'UTF-8');
$mysqli->set_charset("utf8");
。 - Justin Joy foreach ($addresses as $address) { $converted = mb_convert_encoding($address, 'UTF-8', 'UTF-8'); if ($converted !== $address) { dd($addresses); } }
两点:$converted !== $address
条件从未满足。我想这是因为 ===
是一个“二进制安全”的运算符...$converted
分配给任何东西!就像 mb_convert_encoding()
通过引用接受字符串一样,尽管它不是...mb_check_encoding()
和json_decode()
两个函数都不能正常工作。而mb_detect_encoding()
却可以。这是一个坏的UTF-8编码文件的问题。但是经过mb_convert_encoding()
之后,一切都按预期工作了。 - Dan如果您有一个多维数组需要编码为JSON格式,则可以使用以下函数:
如果出现JSON_ERROR_UTF8:
则请您进行相应的处理。
$encoded = json_encode( utf8ize( $responseForJS ) );
以下函数用于递归编码数组数据
/* Use it for json_encode some corrupt UTF-8 chars
* useful for = malformed utf-8 characters possibly incorrectly encoded by json_encode
*/
function utf8ize( $mixed ) {
if (is_array($mixed)) {
foreach ($mixed as $key => $value) {
$mixed[$key] = utf8ize($value);
}
} elseif (is_string($mixed)) {
return mb_convert_encoding($mixed, "UTF-8", "UTF-8");
}
return $mixed;
}
mb_convert_encoding
函数会自行进行递归工作,正如您可以在文档链接中看到的那样:_如果val是一个数组,则它所有的字符串值都将被递归转换。_因此,不需要使用utf8ize
函数。您只需要使用json_encode(mb_convert_encoding($responseForJS, "UTF-8", "UTF-8"));
即可。 - elnezah在php 7.2中,有两个选项允许直接处理json_encode中的无效UTF-8:
https://www.php.net/manual/en/function.json-encode
json_encode($text, JSON_INVALID_UTF8_IGNORE);
或者
json_encode($text, JSON_INVALID_UTF8_SUBSTITUTE);
$pdo = new PDO("mysql:host=localhost;dbname=mybase;charset=utf8", 'user', 'password');
您只需要在PDO连接中添加charset=utf8,像下面的PDO连接行一样:
$pdo = new PDO("mysql:host=localhost;dbname=mybase;charset=utf8", 'user', 'password');
html_entity_decode()
,问题得到了解决。$json = html_entity_decode($source);
$data = json_decode($json,true);
你的结果集中是否有UUID?如果是这样,以下数据库标志将会有所帮助:
PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER => true
我知道这个话题有点老了,但对我来说正是我需要的。我只需要修改答案中的“jayashan perera”。
//...code
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
for ($i=0; $i < sizeof($result) ; $i++) {
$tempCnpj = $result[$i]['CNPJ'];
$tempFornecedor = json_encode(html_entity_decode($result[$i]['Nome_fornecedor']),true) ;
$tempData = $result[$i]['efetivado_data'];
$tempNota = $result[$i]['valor_nota'];
$arrResposta[$i] = ["Status"=>"true", "Cnpj"=>"$tempCnpj", "Fornecedor"=>$tempFornecedor, "Data"=>"$tempData", "Nota"=>"$tempNota" ];
}
echo json_encode($arrResposta);
而且没有使用 .js
obj = JSON.parse(msg);
JSON_UNESCAPED_UNICODE
选项吗? - McRedutf8_encode()
函数用于将8859-1编码转换为UTF8编码,而将UTF8字符串传递给它会破坏该字符串。 - Sammitch