2017-02-22 16 views
0

Мы не можем правильно преобразовать символы Unicode. Мы вносим вклад в формат XML, когда мы пытаемся преобразовать, мы не можем вернуть исходную строку.javax.xml.transform.TransformerFactory Unicode issue - Java

Это код, я использую,

StringCarrier OStringCarrier = new StringCarrier(); 
String SXmlFileData= "<export_candidate_response><criteria><output><lastname>Bhagavath</lastname><firstname>ガネーシュ</firstname></output></export_candidate_response>"; 

String SResult = ""; 
try 
    { 
     TransformerFactory tFactory = TransformerFactory.newInstance(); 
     Transformer transformer = tFactory.newTransformer(new StreamSource(SXslFileName)); 
     transformer.setOutputProperty(OutputKeys.ENCODING, "UTF8"); 
     OutputStream xmlResult = (OutputStream)new ByteArrayOutputStream(); 
     StreamResult outResult = new StreamResult(xmlResult); 
     transformer.transform(new StreamSource(
      new ByteArrayInputStream(SXmlFileData.getBytes("UTF8"))),outResult); 

     SResult = outResult.getOutputStream().toString(); 

     } 
catch (TransformerConfigurationException OException) 
    { 
     //Exception has been thrown 
     OException.printStackTrace(); 
     return OStringCarrier; 
    } 
    catch (TransformerException OException) 
    { 
     //Exception has been thrown 
     OException.printStackTrace(); 
     return OStringCarrier; 
    } 
    catch (Exception OException) 
    { 
     //Exception has been thrown 
     OException.printStackTrace(); 
     return OStringCarrier; 
    } 

Это выход я получаю ã,¬ãƒ? üã, · ム¥ вместо ガ ネ ー シ ュ

+0

Здесь отсутствует код. У вас есть 'else', но нет' if', 'try', но не' catch'. Я уверен, что выходная кодировка не имеет значения, если вы пишете вывод в 'String'. Как вы наблюдаете проблему кодирования? – JLRishe

+0

Я обновил код, можно проверить n дайте мне знать – GaneshBhagavath

+0

Спасибо, но вы все еще не ответили на мой вопрос. Как вы смотрите на результат? Вы пишете это в файл? На консоль? Вы смотрите на него в отладчике? – JLRishe

ответ

1

Это выход я получаю ã,¬ãƒ? ーã, · ム¥ вместо ガ ネ ー シ ュ

Это говорит вам, что где-то в этом процессе, данные в UTF-8 читается кусок Softwa который думает, что читает латинский-1. То, что это не говорит вам, заключается в том, где в процессе это происходит. Поэтому вам нужно разделить и победить - вам нужно найти последнюю точку, в которой данные верны.

Начните с определения проблемы до трансформации или после нее. Это очень просто, если вы используете процессор XSLT 2.0: вы можете использовать `, чтобы увидеть, какая строка символов была предоставлена ​​процессору XSLT. Это немного сложнее с процессором 1.0, но вы можете использовать подстроку ($ in, $ n, 1) для извлечения n-го символа, и это должно дать вам ключ.

Мое подозрение, что это вход. Во-первых, размещение символов, отличных от ASCII, в строковом литерале Java всегда является немного опасным, потому что поездка туда и обратно в исходный репозиторий может легко повредить код, если вы не очень осторожно относитесь ко всему, что настроено правильно. Во-вторых, если строка верна, было бы гораздо безопаснее читать ее с помощью StringReader, а не преобразовывать ее в поток байтов. Попытка:

transformer.transform(new StreamSource(
      new StringReader(SXmlFileData)),outResult); 
+0

, когда я отлаживал код, я смог правильно видеть символы в SXmlFileData. После SXmlFileData.getBytes («UTF-8») я собрал ByteArray и преобразовал обратно в исходную строку .. он смог вернуть исходные символы .. после этого я не смог отлаживать – GaneshBhagavath