Вот функция, которую я написал для преобразования всех не-ASCII-символов в соответствующие им объекты. Может помочь вам продезинфицировать часть содержимого PCDATA перед выводом.
/**
* Creates xml entities for non ascii characters in the given String.
*/
public static String xmlEntitify(String in){
StringBuffer b = new StringBuffer();
for (int i=0;i<in.length();i++){
Character c = in.charAt(i);
if (c<128){
b.append(c);
}
else if (c=='\ufeff'){
// BOM character, just remove it
}
else {
String cstr = Integer.toHexString(c).toUpperCase();
while(cstr.length()<4){
cstr="0"+cstr;
}
b.append("&#x");
b.append(cstr);
b.append(";");
}
}
return b.toString();
}
Считайте ваш входной поток в String content
и запишите в выходной поток xmlEntitify(content)
.
Ваш вывод гарантированно содержит только символы ASCII, больше никаких проблем с кодировкой.
UPDATE
Учитывая комментарии, я буду еще смелее: если вы не очищаете свои данные, вы вызываете проблемы. Я полагаю, вы по крайней мере уже заменяете символы <
и &
в своих PCDATA. Если нет, вам определенно следует. У меня есть другая версия вышеуказанного метода, которая вместо первого if
имеет:
if (c<128 && c!='&' && c!='<' && c!='>' && c!='"'){
b.append(c);
}
, чтобы эти символы также были преобразованы в соответствующие им объекты Unicode.
Это преобразует все мои PCDATA в Unicode-дружественные строки только для ASCII. У меня больше не было проблем с кодированием, так как я использую эту технику. Я никогда не выводил XML PCDATA, который не был передан этим методом: это не сметает слона под ковер. Это просто избавление от проблемы, будучи настолько общим, насколько это возможно.