Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XML: java.io.UTFDataFormatException, Invalid byte 1 of 1-byte UTF-8 sequence. 
V
    Опции темы
brejnev
Дата 21.3.2008, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 18.9.2005

Репутация: нет
Всего: нет



Столкнулся с такой проблемой.
Вытаскиваю из базы( mysql, кодировка utf-8) некоторую сущность person, один из методов которой возвращает XML( кусок XML-кода, хранящийся в БД).

Код

            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
           
            String xml = questionnairePerson.getParams(); //метод сущности возвращающий XML
            InputStream inputStream = new StringInputStream(xml);           
      
            Document doc = documentBuilder.parse(inputStream); // вот тут ошибка


Получаю такую ошибку
Код

[WARN,RequestProcessor,httpSSLWorkerThread-8081-0] Unhandled Exception thrown: class java.io.UTFDataFormatException
StandardWrapperValve[action]: PWC1406: Servlet.service() for servlet action threw exception
java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence.
        at org.apache.xerces.impl.io.UTF8Reader.invalidByte(Unknown Source)
        at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
        at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
        at org.apache.xerces.impl.XMLEntityScanner.skipChar(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
        at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)


Вот такой XML, содержащий русские буквы, хранится в БД.
Код

<?xml version="1.0" encoding="utf-8"?>
<root>
<param>
  <name>Адрес</name>
  <value>Чугуевского 9-122</value>
 </param>
.....
</root>


С кодировками что-то не в порядке. Погуглил, так и не нашел ответа, как тут быть?
PM MAIL   Вверх
Shaggie
Дата 21.3.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 4
Всего: 72



Передавай в documentBuilder.parse(/* something */) не просто поток, а настроенный org.xml.sax.InputSource
Код

        InputStream inputStream = new StringInputStream(xml);  

        InputSource inputSource = new InputSource(inputStream);
        inputSource.setEncoding("ISO-8859-1");

        parser.parse(inputSource);



--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
LSD
Дата 21.3.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Код

Document doc = documentBuilder.parse(new InputSource(new StringReader(xml)));



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Shaggie
Дата 21.3.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 4
Всего: 72



LSD, по моему опыту если setEncoding("ISO-8859-1") не сделать, он всё равно русский не прочитает.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
brejnev
Дата 21.3.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 18.9.2005

Репутация: нет
Всего: нет



Спасибр помогло. Только encoding указал windows-1251.
С тем же XML делаю XLST-преобразование - работает без указания кодировки.
PM MAIL   Вверх
LSD
Дата 21.3.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Shaggie @  21.3.2008,  12:34 Найти цитируемый пост)
LSD, по моему опыту если setEncoding("ISO-8859-1") не сделать, он всё равно русский не прочитает.

Все дело в этой:
Код

InputStream inputStream = new StringInputStream(xml);  

это вообще страшное извращение уже декодированную строку, снова кодировать в байты (не факт что корректно, потому как класс StringInputStream вообще самопальный и неизвестно с какой кодировкой работает), чтобы парсер потом снова из байт декодировал в символы. В моем примере как раз никаких преобразования не делается.

Когда используется символьный input, то парсеру вообще чхать на кодировку, и ту что установлена в прологе и ту, что ты ему руками проставил.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Shaggie
Дата 21.3.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 4
Всего: 72



Цитата(LSD @  21.3.2008,  13:13 Найти цитируемый пост)
уже декодированную строку, снова кодировать в байты

Точно, я ж из файла читал, а тут XML уже строкой в файле существует... проверил - действительно работает.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.3792 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.