2017-10-26 11 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とバイト表現でエンコード
"µà" 

ある:

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.") 
} 

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を使用して、1つのフォーマット(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

関連する問題