Я разбираю XML файл с кодировкой UTF-8.
<?xml version="1.0" encoding="UTF-8"?>
Теперь наше деловое приложение имеет набор компонентов, которые разрабатываются разными командами и не используют одни и те же библиотеки для синтаксического анализа XML. Мой компонент использует JAXB, а другой компонент использует SAX и т.д. Теперь, когда в XML файле есть специальные символы, такие как "ä" или "ë" или "é" (символы с умлаутами), JAXB разбирает его правильно, но другие компоненты (суб-приложения) не могут правильно разобрать их и вызывать исключение.
Из-за необходимости ведения бизнеса я не могу изменить программирование для других компонентов, но я должен поместить ограничение/проверку в мое приложение, чтобы убедиться, что файл XML (data-load) не содержит таких символов.
Лучший способ убедиться, что файл не содержит вышеупомянутых (или похожих) символов, и я могу бросить исключение (или дать ошибку) прямо перед тем, как начать синтаксический анализ файла XML с помощью JAXB.
Вы должны иметь возможность обернуть XML-вход в java.io.Reader
в котором вы указываете фактическое кодирование, а затем обрабатываете это нормально. Java будет использовать кодировку, указанную в XML для InputStream
, но когда используется Reader
будет использоваться кодировка Reader
.
Unmarshaller unmarshaller = jc.createUnmarshaller();
InputStream inputStream = new FileInputStream("input.xml");
Reader reader = new InputStreamReader(inputStream, "UTF-16");
try {
Address address = (Address) unmarshaller.unmarshal(reader);
} finally {
reader.close();
}
да, мой ответ был бы таким же, как упоминает laune...
static boolean readInput() {
boolean isValid = true;
StringBuffer buffer = new StringBuffer();
try {
FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamReader(fis);
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) > -1) {
buffer.append((char)ch);
System.out.println("ch="+ch);
//TODO - check range for each character
//according the wikipedia table http://en.wikipedia.org/wiki/UTF-8
//if it a valid utf-8 character
//if it not in range, the isValid=false;
//and you can break here...
}
in.close();
return isValid;
}
catch (IOException e) {
e.printStackTrace();
return false;
}
}
Я просто добавляю фрагмент кода...
grep "[^\t\r\f -~]" $file && rm $file
;-)
Если ваш клиент отправляет вам XML файл с заголовком, где кодировка не соответствует содержимому файла, вы можете также отказаться от попытки сделать что-либо значимое в этом файле. - Действительно ли они отправляют данные, если заголовок не соответствует фактической кодировке? Это не XML, то. И вы должны их больше обвинить ;-)
Просто прочитайте файл как FileInputStream, байт за байтом. Если он содержит отрицательное значение байта, откажитесь его обрабатывать.
Вы можете сохранить настройки кодирования, такие как UTF-8 или ISO 8859-1, потому что все они имеют US-ASCII как правильное подмножество.
encoding="UTF-8"
а на самом деле это не так, или другой компонент, который вы предоставляете, игнорирует объявление XML и пытается проанализировать его как унаследованную кодировку ( очень маловероятно). Я бы поспорил на первую ситуацию: вы создаете XML с неправильной кодировкой. Исправьте декларацию, чтобы она соответствовала кодировке вашего файла, или исправьте кодировку вашего файла как UTF-8. Чтобы понять, в чем дело , нам понадобится шестнадцатеричный фрагмент из затронутого файла.