2012-08-08 21 views
5

He estado buscando sobre esto durante los últimos días, pero no creo que pueda encontrar un puntero correcto. Combínalo con la pregunta adecuada si se encuentra como duplicado.Caracteres Unicode que aparecen como signos de interrogación en Java JSON Parsing

Soy bastante nuevo para trabajar con JSON y, como parte de uno de mis proyectos, necesito decodificar un archivo JSON y seguir procesándolo en él. Sin embargo, cuando intenté decodificar usando la biblioteca Json-simple, recibí algunos signos de interrogación extraños en el objeto analizado en lugar de los caracteres reales. A continuación se muestra un código de muestra:

String str = "{\"alias\": [\"Evr\u00f3pa\", \"\u05d0\u05d9\u05e8\u05d5\u05e4\"]}"; 
JSONParser parser = new JSONParser(); 
JSONObject jsonObject = (JSONObject)parser.parse(str); 

System.out.println(jsonObject) gives {"alias":["Evrópa","?????"]} 

Intenté usar Json-lib también con el mismo resultado.

Gracias por la ayuda.

+0

Consulte también los comentarios sobre los problemas con 'System.out' en [esta pregunta] (http://stackoverflow.com/questions/11849624) – McDowell

Respuesta

6

El problema no es con su JSON, es con su System.out.println(). Esos caracteres no pueden representarse en la codificación de caracteres de su terminal (o su IDE, si es allí donde lo ejecutó) o de la codificación que usa System.out en su entorno.

Los archivos no pueden contener caracteres Unicode. Los archivos son flujos de bytes, pero Unicode caracteres tienen varios bytes (generalmente dos) en tamaño. Aquí es donde las codificaciones de caracteres se vuelven relevantes. Los caracteres Unicode se deben convertir a una secuencia de bytes para escribirlos en un archivo (incluido System.out). Una de las codificaciones más utilizadas para caracteres Unicode es UTF-8. El truco para los programadores de software es usar siempre la codificación de caracteres correcta al convertir entre bytes y caracteres. Al carecer de la codificación correcta en un solo lugar, por ejemplo, en una llamada debug println(), obtendrá resultados erróneos y engañosos.

+0

Para asegurarme de que no es el caso, ya intenté escribir el mismo objeto que analicé, volver a un archivo y mis caracteres Unicode previamente visibles como códigos en mi editor ahora son visibles como signos de interrogación en el mismo editor. Así que supongo que podría ser un problema con el análisis sintáctico o la codificación de caracteres. –

+0

Probablemente no codificó los caracteres correctamente cuando los escribió en el archivo, y/o su editor no utilizó la misma codificación al leer el archivo. Acabo de probar rápidamente tu JSON utilizando Python (es más rápido que probar con Java) y los datos están bien. Parece que los caracteres son hebreos, creo que – dsh

+0

Bien, acabo de probarlo con Java (OpenJDK 1.6.0, usando la biblioteca libjson-simple-java) y funcionó bien. Mi entorno contiene LANG = en_US.UTF-8; mi gnome-terminal también está configurado en UTF-8. – dsh

0

Probablemente esté utilizando un juego de caracteres predeterminado que no admite el grupo de caracteres especiales. Intente utilizar UTF-8 como su juego de caracteres, algo a lo largo de estas líneas:

String str = "{\"alias\": [\"Evr\u00f3pa\", \"\u05d0\u05d9\u05e8\u05d5\u05e4\"]}"; 
InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(str.getBytes(Charset.forName("UTF-8"))), Charset.forName("UTF-8")); 
JSONParser parser = new JSONParser(); 
JSONObject jsonObject = (JSONObject)parser.parse(isr); 
+1

Los datos ya son una cadena que contiene caracteres Unicode. No hay necesidad de codificarlo en bytes y decodificar los bytes a una cadena. – dsh

+0

Siento lo que dice dsh es correcto. También se ha estudiado en algunos casos en que puede ser debido a que nuestro analizador convierte la codificación Unicode a otra codificación y luego, cuando la codificación de destino no admite ciertos caracteres, se convierten en signos de interrogación. –

Cuestiones relacionadas