¿Por qué los caracteres chinos en JSON causan un error de "mal carácter de control" con JSON.parse?

Tengo una configuration estándar cliente / server de tipo HTML5. El lado del server es todo Java, y el lado del cliente es JavaScript. Usando ajax envío consultas y recibo respuestas. Hasta ahora, no he tenido problemas con JSON.parse(data) . Sin embargo, tengo un nuevo usuario que ingresó su apellido con caracteres chinos. Esto está provocando un error "JSON.parse: carácter de control incorrecto en el literal de cadena" en el lado del cliente.

El server genera una respuesta de la siguiente manera (se omite el event handling excepciones):

 JSONObject jsono = new JSONObject(); jsono.put("last_name", last_name); jsono.put("first-name", first_name); String response = jsono.toString(); 

El cliente recibe algo como:

 {"last_name":"Smith","first_name":"Bob"} 

La respuesta se muestra en una página web que está configurada en <meta charset="utf-8"> :

 var theResult = JSON.parse(data); $('#first_name').html(theResult.first_name); 

Esto funciona bien. Sin embargo, para el usuario chino, el cliente recibe

 {"last_name":"唐","first_name":"Bob"} 

y esto causa el error json.parse.

Ahora comencé a search otros personajes. Por ejemplo, Andrés no causa un error, pero tampoco se visualiza correctamente. Se parece a Andr s .

Entonces, claramente me falta algo. ¿Podría alguien aclararme dónde radica el problema (por ejemplo, ¿es del lado del server? ¿Del lado del cliente? JavaScript? Jquery? Html?) Y cómo resolverlo?

Las bibliotecas más útiles en Java que he usado son Gson API y JSONObject, y ambas pueden manejar este problema; luego, si lo haces, tu problema probablemente se resuelva. Solo tenga cuidado con todos los params relacionados con utf-8 que aquí son realmente importantes:

 JSONObject jsono = new JSONObject(); jsono.put("last_name", "唐"); jsono.put("first-name", firstName); String myjsonString = jsono.toString(); //write your output DataOutputStream out = new DataOutputStream(new FileOutputStream("myjson.txt")); out.write(myjsonString.getBytes("utf-8"),0, myjsonString.getBytes("UTF-8").length);