json_encode) 我的 PHP 源: JSON 字符串在我的网络浏览器中-6ren">
gpt4 book ai didi

java - GSON 库无法正确解析 JSON UTF-8,用 "?"替换重音

转载 作者:太空宇宙 更新时间:2023-11-04 07:49:03 24 4
gpt4 key购买 nike

我尝试使用 GSON 库开发一个 Java 应用程序来解析 JSON(来自 PHP 文件(以 UTF-8 编码)-> json_encode)

我的 PHP 源:

<?php
$base = mysql_connect ('****', '*****', '*****');
mysql_select_db ('*****', $base) ;
$req = mysql_query("SELECT ***, ****, ***, ****, **** from *****");

function jsonRemoveUnicodeSequences($struct) {
return preg_replace("/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($struct));
}

while ($row = mysql_fetch_array($req)) {
$output[] = $row;
}

print(jsonRemoveUnicodeSequences($output));
mysql_free_result ($req);
?>

JSON 字符串在我的网络浏览器中正确显示,并带有重音符号。

我的Java源代码:

        BufferedReader reader = null;

try {
URL url = new URL("**************");
URLConnection urlConnection = url.openConnection();

reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));

StringBuilder sb = new StringBuilder();
String line = null;

while ((line = reader.readLine()) != null) {
sb.append(line);
System.out.println("JSON data issu du PHP : "+ line + "\n");
Gson gson = new Gson();

Type type = new TypeToken<List<AlertTable>>(){}.getType();
ArrayList<AlertTable> bddListJson = gson.fromJson(line, type);
bddList = (ArrayList<AlertTable>) bddListJson.clone();
}
} catch (IOException e) {
//
} finally {
if (reader != null) {
//
}
}

System.out.println(bddList.get(1).getTypeAlert());
System.out.println(bddList.get(1).getLigne());
System.out.println(bddList.get(1).getSens());
System.out.println(bddList.get(1).getStation());
System.out.println(bddList.get(1).getTimeAlert());

并且在控制台中,带重音的字符被替换为“?”。

有什么想法吗?

最佳答案

首先,请注意,您的代码在某些系统上可能会失败,因为 MySQL 使用连接字符集在客户端和服务器之间移动文本。您应该发出像 SET NAMES <charset> 这样的原始查询设置脚本中可用输入数据的编码。

现在,假设不存在转码问题(因为您的列仅存储 ASCII 字符,并且涉及的所有字符集都是 ASCII 兼容的),我编写了以下代码来替换 \u0000带有 UTF8 编码字符串的转义序列:

<?php

while ($row = mysql_fetch_array($req)) {
$out[] = preg_replace_callback("/\\\\u([a-f0-9]{4})/i", "unescape", $row);
}

// On PHP 5.4+ use json_encode($out, JSON_UNESCAPED_UNICODE)
echo json_encode($out);

/* Accept the matcher array
* return the UTF-8 encoded string
*/
function unescape($match) {
return call_user_func_array('pack', get_pack_args(hexdec($match[1])));
}

function get_pack_args($cp) {
if ($cp < 0x80) return array('C1', $cp);

if ($cp < 0x0800) {
$length = 2;
} else if ($cp < 0x010000) {
$length = 3;
} else {
$length = 4;
}

$args[0] = "C{$length}";

// lead byte
$args[1] = (0xFE << (7 - $length)) | ($cp >> (6 * ($length - 1)));

// continuation bytes
for ($l = 0; $l < ($length - 1); $l++) {
$args[$length - $l] = 0x80 | (($cp >> (6 * $l)) & 0x3F);
}

// stupid PHP...
ksort($args);
return $args;
}

您应该深入测试代码,但这是一个很好的起点。为了在浏览器中显示,您应该使用 HTTP header 指定编码:

header('Content-Type: application/json; charset=utf8');

请注意json_encode()默认情况下转义 unicode 序列。这是低效的,因此您可能需要使用 JSON_UNESCAPED_UNICODE标志,或选择另一个 JSON 库进行编码。

此时服务器部分应该没问题了,你可以用浏览器测试一下。如果它可以工作,但 Java 程序仍然无法在控制台上显示正确的字符,则可能是控制台本身的问题,甚至是控制台应用程序使用的字体的问题。如果没有实际数据,人们无法判断,但是请按照我的建议将 JSON 打印到 UTF8 编码的文本文件中。然后使用文本编辑器打开它(如果需要,指定 UTF-8)并告诉您所看到的内容。

最后,请注意 mysql 的用法不鼓励使用 PHP 扩展。使用mysqliPDO相反。

关于java - GSON 库无法正确解析 JSON UTF-8,用 "?"替换重音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14801546/

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