2013-02-10 1 views
1

Я пытаюсь разработать приложение Java с библиотекой GSON для разбора JSON (из PHP-файла (в кодировке UTF-8) -> json_encode)Библиотека GSON анализирует JSON UTF-8 неправильно, замените акцент на «?»

Мой источник 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()); 

И в консоли, символ с акцентом заменяется на "?".

Любая идея?

+0

Чтобы быть уверенным, можете ли вы исключить проблему с консолью? Вы пытались напечатать символы в файле, закодированном в некоторой схеме Unicode, например UTF-8? – Raffaele

ответ

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() Обратите внимание, что ускользает Юникод последовательность со своей стороны, по умолчанию. Это неэффективно, поэтому вы можете использовать флаг JSON_UNESCAPED_UNICODE или выбрать другую библиотеку JSON для кодирования.

На этом этапе серверная часть должна быть в порядке, и вы можете протестировать ее в своем браузере. Если он работает, но программа Java не может отображать правильные символы на консоли, это может быть проблема с самой консолью или даже с шрифтом, используемым консольным приложением. Без фактических данных вы не можете сказать, однако следуйте моему совету и распечатайте JSON в текстовом файле UTF8-encoded. Затем откройте его текстовым редактором (при необходимости указывая UTF-8) и сообщите, что вы видите.

Наконец, обратите внимание, что использование расширения PHP mysql не рекомендуется. Используйте вместо этого mysqli или PDO.

0

, если Вы установите параметр json_encode Правильно, как

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

никаких проблем в стоимостных данных кодирования и передачи, но если не работать снова, вы не можете использовать UrlEncode для Кодировать в UTF-8 Значение и Decode его на Java

как этот

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

выход

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

с этим выходом У вас нет проблем с json-значением.

+0

, но это только для URL-адреса в запросе. кажется, проблема здесь с ответом. –

+0

@ ClemensKlein-Robbenhaar привет, мой измененный ответ. –

Смежные вопросы