String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml"));
これIOUtils
がそうである場合org.apache.commons.io.IOUtils
、そのJavadocは言う
「プラットフォームのデフォルトの文字エンコーディングを使用して、InputStream の内容を文字列として取得します。」
cp1250 として保存しているので、cp1250 はプラットフォームの文字エンコーディングでもあると思います。あなたのコードがやっていることは
- ファイルをバイトストリームとして読み取る
- cp1250 (プラットフォーム エンコーディング) を使用してバイト ストリームを文字に変換します。
- 文字を Java 内部表現 (UTF-16) に変換します。
- UTF-16 から UTF-8 への変換
- XML ドキュメントの作成
cp1250は実際にはファイル エンコーディングであるため、常に機能します。UTF-16 には cp1250 のすべての文字があり、UTF-8 には UTF-16 のすべての文字があります。
バイトを UTF-8 として読み取り、自動変換を回避する場合は、次の 2 つのパラメーターのバリアントのいずれかを使用する必要がありますIOUtils.toString()
。
public static String toString(InputStream input, Charset encoding)
public static String toString(InputStream input, String encoding)
だから私は試してみます:
// Helper import: I always forget if the constant is "UTF8" or "UTF-8"
import org.apache.commons.lang.CharEncoding;
String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml"), CharEncoding.UTF_8);
Document doc = builder.parse(IOUtils.toInputStream(xml, CharEncoding.UTF_8));
ここでの経験則は次のとおりです。ソース/宛先エンコーディングを指定せずに、バイトから文字列へ/文字列からバイトへの変換を絶対に行わないでください。
ちょっとした経験則は次のとおりです。他のエンコーディングを使用する必要がない限り、どこでも UTF-8 を使用してください。
これらの経験則はどちらも、選択したプログラミング言語とは無関係です。