2016-12-05 11 views
1

저는 sparql을 처음 사용합니다. 우르두어 결과를 sparql 쿼리에서 검색하려고하는데 코드가 Java 폼에서 정상적으로 작동하지만 jsp에서 결과를 인쇄하려고하면 "ا ? ر_ب "와 같이 표시됩니다.jsp의 urdu 온톨로지 결과

String novelname=request.getParameter("Id"); 
      novelname = novelname.replaceAll("\\s",""); 
       OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_MICRO_RULE_INF); 
FileManager.get().readModel(model, "C:/Users/Bisma/Documents/NetBeansProjects/Novelmania/web/novelname.owl"); 
     String queryStrings ="prefix uni: <http://www.semanticweb.org/novelname.owl#>" + 
"select * {uni:"+novelname+" uni:translate ?Novelname. }"; 
Query query = QueryFactory.create(queryStrings); 
QueryExecution qe= QueryExecutionFactory.create(query, model); 
org.apache.jena.query.ResultSet resultset = qe.execSelect(); 
java.io.ByteArrayOutputStream baos= new java.io.ByteArrayOutputStream(); 
      ResultSetFormatter.outputAsCSV(baos, resultset); 
      String answer= new String(baos.toString().getBytes("ISO8859_1"), "UTF-8"); 

      answer= java.util.Arrays.toString(answer.split("http://www.semanticweb.org/novelname.owl#")); 
String[] arrays = answer.split(","); 
String nam=arrays[1]; 
nam=nam.substring(0, nam.length()-1); 
nam=nam.replaceAll("\\s",""); 
out.print(nam); 

? ? "이

답변

1

귀하의 코드 샘플과 같이 조금 지저분하다, 그래서 정확히 무슨 일이 잘못된 것입니다 볼 어렵다, 그러나 나는 문제의 그 부분이 잘못 우르두어 문자를 디코딩하는 것을 생각 :

String answer = new String(baos.toString().getBytes("ISO8859_1"), "UTF-8"); 

그래서, 당신은 기본 플랫폼 인코딩을 사용하여 문자열로 바이트 배열을 디코딩 toString를 호출하는에 ByteArrayOutputStream 가지고 - 바이트 배열은 또한 기본 플랫폼 인코딩을 사용하여 생성 된 경우에만 제대로 작동합니다 . 그렇지 않은 경우 사용할 인코딩을 명시해야합니다 (toString(charsetname).

방금 ​​생성 한 문자열에서 getBytes("ISO8859_1")을 호출합니다. 따라서 으로 바꾼 문자열을 ISO-8859-1 인코딩을 사용하여 바이트로 변환합니다. "ISO8859_1"이 사용할 올바른 문자 집합 이름이 아님을 제외하면 ("ISO-8859-1"이어야하며, 더 좋은 것은 아직 StandardCharsets.ISO_8859_1 상수를 사용해야합니다.) 이것은 잘못된 것입니다. ISO-8859-1은 라틴 알파벳의 기본 문자이므로 Urdu에는 적합하지 않습니다.

마지막으로 두 번째 바이트 배열을 String으로 다시 변환하지만 이번에는 UTF-8 charset 인코딩을 사용합니다. 다른 인코딩을 사용하여 바이트 배열을 생성했기 때문에 이것은 틀 렸습니다. 따라서 을 알고 있습니다. UTF-8이 아닙니다!

간단히 말해서 엉망입니다. 난 당신이 정말해야 할 일은이 생각 :

String answer = baos.toString(charsetName); 

... 다음은 charsetName는 바이트 배열을 만드는 데 사용 된 문자 집합 인코딩, 즉,해야 알아낼.