2012-11-27 8 views
1

내 응용 프로그램에는 요청에서 JSONObject를 읽고 다른 곳에서 사용되는 일부 Java 객체를 생성하는 Java 서블릿이 있습니다. ISO-8859-1로 인코딩 된 문자열이 JSON에 있기 때문에 문제가 발생합니다. Java 문자열로 추출하면 인코딩이 UTF-16으로 해석됩니다. 다른 JSON 객체에 넣으려면 올바르게 인코딩 된 문자열을 다시 가져올 수 있어야합니다.ISO-8859-1 인코딩 된 문자열을 Java JSON 외부로 가져옴

ByteBuffers 및 CharBuffers를 사용해 보았지만 전혀 문자를 얻지 못했습니다. ISO-8859-1을 사용하는 다른 응용 프로그램과 잘 작동해야하므로 인코딩을 변경할 수 없습니다.

팁을 주시면 감사하겠습니다.

Struts 1.3.8을 사용하는 레거시 애플리케이션입니다. JSONObject 및 JSONArray에 대해 net.sf.json 2.2.4를 사용하고 있습니다.

구문 분석 코드 중 일부이다

final JSONObject a = (JSONObject) i; 
final JSONObject attr = a.getJSONObject("attribute"); 
final String category = attr.getString("category"); 

final String value = attr.getString("value"); 

그때 디스플레이를 위해 클라이언트에 전달 JSON을 생성하는 다른 액션 클래스에 의해 검색되는 정보를 사용하여 POJO를 만들거나 다른 전달 응용 프로그램.

JSON에 "Juan Guzmán"문자열이 포함되어있는 경우 Java String에 Juan Guzm? _An (필자의 경우 정확한 문자열이 없습니다)이 포함되어 있습니다. 올바른 발음 구별을 다시 얻는 방법을 모르겠습니다. 정확한 표현이 포함 된 Java String을 얻을 수 있다면 아래의 Mezzie 솔루션을 사용하면 JSON에 다시 넣을 올바른 인코딩으로 문자열을 만들 수 있습니다.

+0

안녕하세요 Betsey, 그리고 스택 오버 플로우에 오신 것을 환영합니다. 여기서 좀 더 자세한 정보를 제공해야합니다. 독서를하는 코드를 붙여 넣을 수 있습니까? 또는 적어도이 작업을 위해 사용중인 프레임 워크/라이브러리를 명시하십시오. –

+0

@ AleksanderBlomskøld, 위의 약간의 세부 정보를 추가했습니다. 도움이 되었기를 바랍니다. 빠른 응답에 감사드립니다! – betseyb

답변

0

나는 동일한 문제가 있었고 나는 당신과 같은 기술을 사용하고 있습니다. 우리의 경우에는 UTF-8 이었으므로 UTF-16으로 변경하십시오.

public static String UTF8toISO(String str) 
    { 
     try 
     { 
      return new String(str.getBytes("ISO-8859-1"), "UTF-8"); 
     } 
     catch (UnsupportedEncodingException e) 
     { 
      e.printStackTrace(); 
     } 
     return str; 
    } 
+0

안녕하세요 @ mezzie, 답장을 보내 주셔서 감사합니다. 나는 조금 혼란 스럽다. JSON에서 데이터를 읽을 때 Java는 기본적으로 UTF16으로 인코딩하기 때문에 Java 문자열에서 잘못 표현됩니다. 위의 방법으로 올바른 형식의 Java 문자열에서 ISO-8859-1로 인코딩 된 문자열을 가져올 수 있다고 생각하지만 문제의 원래 절반을 해결하지 못한다고 생각합니다. – betseyb

+0

안녕하세요 벳지, 당신이보고 싶어 할지도 모르는 몇 가지가 있습니다. Java는 기본적으로 문자열을 UTF16으로 인코딩하지 않습니다. 문제는 그것을 UTF 16으로 인코딩하는 이유입니다. 요청이 sevlet으로 어떻게 전달됩니까? 아약스를 통해서인가? 그렇다면 문자 인코딩을 설정하여 백엔드에서 문자 인코딩을 처리 할 필요가 없을 수도 있습니다. 백엔드에서 전달되는 데이터를 제어 할 수없는 경우이 메소드로 디코딩하면 도움이됩니다. – mezzie

+0

Javadocs에 따르면 Java는 기본적으로 1.6 이상 (사용해야하는 버전)의 문자열을 UTF-16으로 인코딩합니다. String은 UTF-16 형식의 문자열을 나타냅니다. 보충 문자는 서로 게이트 쌍으로 표현됩니다 (자세한 내용은 Character 클래스의 유니 코드 문자 표현을 참조하십시오). 인덱스 값은 char 코드 단위를 참조하므로 보조 문자는 String에서 두 위치를 사용합니다. 문제의 일부를 해결했다고 생각합니다. 이 시점에서 내가 놓친 곳이 몇 개 있으며 추적하고 있습니다. 감사! – betseyb