1

JAXBにはXMLの性質に起因するバグがあり、UTF-8で動作しないというSOの回答をいくつか読みました。私の質問は、回避策は何ですか?ユーザーがデータ フィールドにコピー アンド ペーストして Unicode 文字を入力することがあります。このデータ フィールドは、保存、マーシャリング、アンマーシャリング、および別の場所で再表示する必要があります。

(更新)その他のコンテキスト:

Candidate c = new Candidate();
c.addSubstitution("3 4ths", "\u00BE");
c.addSubstitution("n with tilde", "\u00F1");
    c.addSubstitution("schwa", "\u018F");
    c.addSubstitution("Sigma", "\u03A3");
    c.addSubstitution("Cyrillic Th", "\u040B");     
    jc = JAXBContext.newInstance(Candidate.class);
    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    marshaller.marshal(c, os);
    String xml = os.toString();
    System.out.println(xml);    
    jc = JAXBContext.newInstance(Candidate.class);
    Unmarshaller jaxb = jc.createUnmarshaller();
    ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes());
    Candidate newCandidate = (Candidate) jaxb.unmarshal(is);
    for(Substitution s:c.getSubstitutions()) {
        System.out.println(s.getSubstitutionName() + "='" + s.getSubstitutionValue() + "'");
    }

ここに私が一緒に投げた小さなテストビットがあります. 私が取得した正確な文字は、完全に私の管理下にあるわけではありません. ユーザーはチルダ付きの N をフィールドなどに貼り付けることができます。

4

1 に答える 1

8

これは、テスト コードの問題です。

ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes());

プラットフォームのデフォルトのエンコーディングを使用して、文字列をバイト配列に変換しています。そうしないでください。UTF-8 を使用することを指定したので、バイト配列を作成するときにそうする必要があります。

ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));

ByteArrayOutputStream.toString()同様に、プラットフォームのデフォルトのエンコーディングを使用するも使用しないでください。実際、出力を文字列に変換する必要はまったくありません。

ByteArrayOutputStream os = new ByteArrayOutputStream();
marshaller.marshal(c, os);
byte[] xml = os.toByteArray();
jc = JAXBContext.newInstance(Candidate.class);
Unmarshaller jaxb = jc.createUnmarshaller();
ByteArrayInputStream is = new ByteArrayInputStream(xml);

これは、使用している文字には問題がないはずです。XML 1.0 で表現できない問題 ( \r,\nと以外の U+0020 未満の文字\t) はまだありますが、それだけです。

于 2013-08-12T18:39:05.743 に答える