JAXP Sax Parser Java-ME Midlet Исключение из анализа китайского символа - PullRequest
1 голос
/ 20 июля 2011

У меня большие проблемы при разборе некоторых китайских символов, закодированных в формате Unicode HTML, встроенных в файлы XML.

Я использую Java ME с javax.xml.parsers.SAXParser

Одним из таких файлов символов является 词:

<test>&#35789;</test>


Информация о нем: http://www.isthisthingon.org/unicode/index.php?page=08&subpage=B&glyph=08BCD

Ностранно 101

<test>&#21518;</test>

работает нормально.

Прямое встраивание <test>词</test> также работает.

Мой тестовый мидлет имеет следующий исходный код:

import java.io.InputStream;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.helpers.DefaultHandler;


public class jaxp extends MIDlet {

public jaxp() {
}

protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException {
}

protected void pauseApp() {
}

protected void startApp() throws MIDletStateChangeException {
    try {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();
        DefaultHandler handler = new DefaultHandler() {};
        String fileName = "test.xml";
        InputStream is = jaxp.class.getResourceAsStream("/" + fileName);
        saxParser.parse(is, handler);
    } catch (Exception e) {
        e.printStackTrace();
    }

}
}

Он умирает с:

org.xml.sax.SAXParseException: 
at org.xml.sax.helpers.DefaultHandler.fatalError(+1)
at com.sun.ukit.jaxp.Parser.panic(+18)
at com.sun.ukit.jaxp.Parser.ent(+586)
at com.sun.ukit.jaxp.Parser.elm(+434)
at com.sun.ukit.jaxp.Parser.parse(+199)
at com.sun.ukit.jaxp.Parser.parse(+47)
at com.sun.ukit.jaxp.Parser.parse(+31)
at jaxp.startApp(+83)
at javax.microedition.midlet.MIDletProxy.startApp(+7)
at com.nokia.mid.impl.isa.ui.MIDletManager.callStartApp(+4)
at com.nokia.mid.impl.isa.ui.MIDletManager.activateMIDlet(+10)
at com.nokia.mid.impl.isa.ui.MIDletManager.run(+15)

Буду признателен за любые идеи.

1 Ответ

2 голосов
/ 16 февраля 2014

Я явно опаздываю с этим ответом. Тем не менее, для записи ...

Я написал этот парсер несколько лет назад. В методе ent версия парсера из JSR172 использовала Short.parseShort для преобразования значения сущности в символ. Если значение превышает 32767, Short.parseShort создает исключение NumberFormatException. Это исключение отлавливается в методе ent и приводит к вызову метода panic.

Более поздняя версия парсера использовалась в JSR280. Эта версия должна правильно обрабатывать значения выше 32767.

...