2012-08-08 2 views
5

지난 며칠 동안이 문제를 조사했지만 올바른 포인터를 찾을 수 없다고 생각합니다. 중복으로 발견되면 해당 질문과 병합하십시오.Java에서 물음표로 나타나는 유니 코드 문자 JSON 구문 분석

저는 JSON 작업에 상당히 익숙하며 내 프로젝트 중 하나로서 JSON 파일을 디코딩하고 추가 처리해야합니다. 그러나 Json-simple 라이브러리를 사용하여 디코딩을 시도했을 때 실제 문자 대신 파스 된 객체에 이상한 물음표가 나타납니다. 샘플 코드는 아래와 같습니다.

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","?????"]} 

동일한 결과로 Json-lib를 사용해 보았습니다.

도움 주셔서 감사합니다.

+0

또한 [이 질문에있는 System.out의 문제에 대한 의견보기] (http://stackoverflow.com/questions/11849624) – McDowell

답변

6

문제는 당신의 JSON하지, 그것은 당신의에서 System.out.println와의(). 이러한 문자는 터미널 (또는 사용자가 직접 실행 한 IDE 인 경우) 또는 사용자 환경에서 System.out에서 사용하는 인코딩의 문자 인코딩으로 표현할 수 없습니다.

파일에 유니 코드 문자를 사용할 수 없습니다. 파일은 바이트의 스트림이지만 유니 코드 문자은 크기가 여러 바이트 (일반적으로 2)입니다. 문자 인코딩이 관련성이있는 곳입니다. 유니 코드 문자는 파일 (System.out 포함)에 쓰려면 일련의 바이트로 변환되어야합니다. 유니 코드 문자에 가장 일반적으로 사용되는 인코딩 중 하나는 UTF-8입니다. 소프트웨어 프로그래머의 트릭은 바이트와 문자를 변환 할 때 항상 올바른 문자 인코딩을 사용하는 것입니다. 예를 들어 디버그 println() 호출과 같이 한 곳에서 올바른 인코딩이 부족하면 오류가 오해의 소지가 있습니다.

+0

이것이 사실이 아닌지 확인하기 위해 필자는 이미 구문 분석 한 동일한 객체를 작성하려고 시도 했었습니다. 파일로 돌아와 이전에 편집기에서 코드로 표시되었던 유니 코드 문자가 이제는 동일한 편집기에서 물음표로 표시됩니다. 그래서 파싱이나 문자 인코딩에 문제가있는 것 같아요. –

+0

아마도 파일에 쓸 때 문자를 올바르게 인코딩하지 않았거나 편집기에서 파일을 읽을 때 동일한 인코딩을 사용하지 않았을 것입니다. 방금 Python을 사용하여 JSON을 테스트했습니다 (Java로 테스트하는 것보다 빠름). 데이터는 문제가 없습니다. 문자가 히브리어 인 것 같아요. – dsh

+0

그래, 방금 Java (OpenJDK 1.6.0, libjson-simple-java 라이브러리 사용)로 테스트 해 보았는데 정상적으로 작동했습니다. 내 환경에 LANG = en_US.UTF-8; 내 그놈 터미널도 마찬가지로 UTF-8로 설정됩니다. – dsh

0

아마도 특수 문자 그룹을 지원하지 않는 기본 문자 집합을 사용하고있을 것입니다. 이 라인을 따라 당신의 캐릭터 세트로 UTF-8, 뭔가를 사용해보십시오 :

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

데이터는 이미 유니 코드 문자가 포함 된 문자열입니다. 이를 바이트로 인코딩 할 필요가 없으며 바이트를 다시 문자열로 디코딩합니다. – dsh

+0

dsh가 말하는 것이 정확하다고 느낍니다. 파서가 유니 코드 인코딩을 다른 인코딩으로 변환 한 후 대상 인코딩이 특정 문자를 지원하지 않을 때 물음표로 변환 될 수있는 이유를 연구했습니다. –