2017-10-26 6 views
0

인코딩에 대한 정보가없는 다양한 입력 텍스트 파일에서 가져온 텍스트 문자열을 포함하는 XML 문서를 구문 분석하면서 특성 값으로 저장됩니다. XML 문서 자체는 특정 인코딩으로 생성되지만 텍스트 문자열은 원래 인코딩이 무엇인지에 대한 추가 정보없이 XML 문서에 이진 데이터로 전달됩니다. 127 위의 ASCII 값이 문자가 이스케이프 :Java에서 SAX로 파싱 된 XML 속성 값에서 원시 이진 데이터 가져 오기

<?xml version="1.0" encoding="ISO-8859-2" ?> 
<Root> 
    <Value val="&quot;&#xb5;&#xe0;&quot;"/> 
</Root> 

전체 XML 문서 요소 의 속성 ISO-8859-2 및 값으로 인코딩된다 :

PSPad HEX 뷰어에 따른
"µà" 

원래 으로 인코딩 ISO-8859-1와 바이트 표현 :

,617,
22 B5 E0 22 
또한 ISO-8859-2 같이 표현 될 수

: 문제는

"ľŕ" 

, 내가ISO-8859-2로 구문 분석 원하지만 SAX 파서에서 정규화되지 않은 값을 얻을 수 없습니다. 속성의 값은 이미 같은 텍스트를 나타내는 String 객체 인스턴스의 형태로 얻을 수있다 :

"µà" 

내가ISO-8859-2에서 XML을 구문 분석 파서를 설득하려고 노력을하지만, 아무것도 변경되지 않습니다 :

String val = attributes.getValue("val"); 
try{ 
     byte[] bytes = val.getBytes(StandardCharsets.UTF_16); 
     ByteBuffer inputBuffer = ByteBuffer.wrap(bytes); 
     CharBuffer chData = Charset.forName("ISO-8859-2").decode(inputBuffer); 
} catch (UnsupportedEncodingException e) { 
     System.out.println("Encoding not supported.") 
} 
,691,363 :

XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); 
MyHandler handler= new MyHandler(); // implementation of DefaultHandler 
parser.setContentHandler(handler); 
parser.setEntityResolver(handler); 
InputStream instream = new FileInputStream("myFile.xml"); 
InputSource is = new InputSource(instream); 
is.setEncoding("ISO-8859-2"); 
parser.parse(is); 

나는 UTF-16로 문자열을 취급 바이트를 취득하고 원하는 값을 만들려면 다음 바이트를 사용하려고 (210)

하지만 내가 얻을 것은 : respectivelly

ţ˙ " ľ ŕ " 

:이 방법은 텍스트 값의 원래 이진 표현을 구하는 방법에 유일한 올바른 접근 방식 인 경우

[-2, -1, 0, 34, 0, -75, 0, -32, 0, 34] 

나는 확실하지 않다.

귀하의 조언에 감사드립니다.

답변

0

문제는 SAX와 관련이 없지만 바이트 배열을 ISO-8859-2 인코딩 된 문자열로 변환하는 방법에 문제가 있습니다. 따라서 How to convert Strings to and from UTF8 byte arrays in Java을 사용하여 하나의 형식 (ISO-8859-1)을 사용하여 특성에서 바이트 배열로 문자열을 변환하고 다른 형식 (ISO-8859-2)의 문자열로 다시 변환 할 수 있습니다.

String s = "\"µà\""; 
System.out.println(s); 
byte[] iso8859_1_bytes = s.getBytes(Charset.forName("ISO-8859-1")); 
System.out.println(Arrays.toString(iso8859_1_bytes)); 
String conv = new String(iso8859_1_bytes, Charset.forName("ISO-8859-2")); 
System.out.println(conv); 

다음과 같은 출력을 생성합니다

"µà" 
[34, -75, -32, 34] 
"ľŕ" 
+0

문제는 _ISO-8859-1_이 값으로는 아무 상관이 없다는 것입니다.심지어 전체 구문 분석 과정에서 _ISO-8859-1_ 인코딩에 대한 참조가 없습니다. 내가 아는 유일한 것은 ** "" µ à ""**는 가능한 _ISO-8859-2_로 처리해야하지만 파서가 해당 인코딩의 XML을 처리하도록 강제 할 수는 없다는 것입니다. 나는 속성의 값의 정규화가 _UTF-16_ String 인스턴스로 파싱하는 것으로 생각한다. 그럼에도 불구하고, 당신의 대답에 감사드립니다. – WakamaHeja