私はISO-8859-1文字エンコーディングでXMLファイルを解析するためにJava SAXパーサを使用しようとしています。これはうまくいくが、äやöのような特殊文字は私に頭痛を与えている。つまり、ContentHandler.characters(...)メソッドは私に奇妙な文字を与え、文字配列を使って指定されたエンコーディングを持つStringを構築することさえできません。ラテン-1形式で保存するので、hexdumpに対してはこれを与えているファイル元のLatin-1 char []をSAXパーサから適切なUTF-8文字列に変換するにはどうすればよいですか?
<?xml version='1.0' encoding='ISO-8859-1' standalone='no' ?>
<x>Motörhead</x>
:
latin1.xml:ここ
は、2つのファイルに例を働い完全な最小です
$ hexdump -C latin1.xml
00000000 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 27 31 |<?xml version='1|
00000010 2e 30 27 20 65 6e 63 6f 64 69 6e 67 3d 27 49 53 |.0' encoding='IS|
00000020 4f 2d 38 38 35 39 2d 31 27 20 73 74 61 6e 64 61 |O-8859-1' standa|
00000030 6c 6f 6e 65 3d 27 6e 6f 27 20 3f 3e 0a 3c 78 3e |lone='no' ?>.<x>|
00000040 4d 6f 74 f6 72 68 65 61 64 3c 2f 78 3e |Mot.rhead</x>|
"ö"は、期待通りに1バイトのf6でエンコードされています。
次に、ここではUTF-8形式で保存されたJavaファイル、だ:
MySAXHandler.java:
import java.io.File;
import java.io.FileReader;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class MySAXHandler extends DefaultHandler {
private static final String FILE = "latin1.xml"; // Edit this to point to the correct file
@Override
public void characters(char[] ch, int start, int length) {
char[] dstCharArray = new char[length];
System.arraycopy(ch, start, dstCharArray, 0, length);
String strValue = new String(dstCharArray);
System.out.println("Read: '"+strValue+"'");
assert("Motörhead".equals(strValue));
}
private XMLReader getXMLReader() {
try {
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setContentHandler(new MySAXHandler());
return xmlReader;
} catch (Exception ex) {
throw new RuntimeException("Epic fail.", ex);
}
}
public void go() {
try {
XMLReader reader = getXMLReader();
reader.parse(new InputSource(new FileReader(new File(FILE))));
} catch (Exception ex) {
throw new RuntimeException("The most epic fail.", ex);
}
}
public static void main(String[] args) {
MySAXHandler tester = new MySAXHandler();
tester.go();
}
}
は、このプログラムの実行結果は、それがRead: 'Mot�rhead'
(ö置き換えを出力していることです"?in a box")、アサーションエラーのためクラッシュします。 char配列を調べると、文字öをエンコードするcharが3バイトで構成されていることがわかります。彼らはUTF-8のように2バイトでエンコードする必要があるので、私には分かりません。
は私が
を試してみましたが、私は、文字セットエンコーディングパラメータを別の文字列のコンストラクタに渡すためにその文字列のバイト数を取得し、文字列に文字列を変換しようとしています。私もCharBuffersで遊んで、この問題を解決するためにLocaleクラスで動作する可能性のあるものを見つけようとしましたが、何も試してみることはできません。文字で
新しい 'FileReader()'ではなく 'new FileInputStream()'を使うとどうなりますか?または、新しいInputStreamReader(新しいFileInputStream(FILE)、 "ISO-8859-1")) '? –
を参照してください。http://stackoverflow.com/questions/3482494/howto-let-the-sax-parser-determine-the-encoding-from-the-xml-declaration –
注:characters()メソッドは、マルチバイト文字のバイトは、同じcharacters()イベントに一緒に表示されます。 –