2

JSONを解析するためにGSONライブラリを使用してJavaアプリケーションを開発しようとしています(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 文字列は、Web ブラウザーでアクセント付きで正しく表示されます。

私の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());

また、コンソールでは、アクセント付きの文字は「?」に置き換えられます。

何か案が ?

4

2 に答える 2

1

最初に、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('Content-Type: application/json; charset=utf8');

json_encode()デフォルトでは、一部の Unicode シーケンスをエスケープすることに注意してください。これは非効率的なため、フラグを使用するJSON_UNESCAPED_UNICODEか、エンコーディング用に別の JSON ライブラリを選択することをお勧めします。

この時点で、サーバー部分は問題なく、ブラウザでテストできます。動作しても Java プログラムがコンソールに正しい文字を表示できない場合は、コンソール自体に問題があるか、コンソール アプリケーションで使用されているフォントに問題がある可能性があります。実際のデータがないとわかりませんが、私のアドバイスに従って、JSON を UTF8 でエンコードされたテキスト ファイルに出力してください。次に、テキスト エディター (必要に応じて UTF-8 を指定) で開き、表示される内容を伝えます。

mysql最後に、 PHP 拡張機能の使用は推奨されないことに注意してください。代わりにmysqliまたはを使用してください。PDO

于 2013-02-11T01:06:56.563 に答える
0

json_encode のパラメータを正しく設定すると

 json_encode($WhoRank,JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE);

値のエンコードとデータの転送に問題はありませんが、再度機能しない場合は、urlencodeを使用して UTF-8 値をエンコードし、Java でデコードできます

このような

urlencode('aیgfسبd');

出力

a%DB%8Cgf%D8%B3%D8%A8d

この出力でjson値に問題はありません。

于 2013-02-10T19:23:38.947 に答える