JAXP Sax 解析器 Java-ME Midlet 解析中文字符时出现异常

发布于 2024-11-25 02:26:30 字数 2169 浏览 2 评论 0原文

我在解析一些编码为 HTML Unicode 的中文字符时遇到了很大的麻烦, 嵌入 XML 文件中。

我正在使用Java MEjavax.xml.parsers.SAXParser

这样的字符文件是词:

<test>&#35789;</test>


有关它的信息:< a href="http://www.isthisthingon.org/unicode/index.php?page=08&subpage=B&glyph=08BCD" rel="nofollow">http://www.isthisthingon.org/unicode/index.php?page=08&subpage=B&glyph=08BCD

但奇怪的是后面

<test>&#21518;</test>

工作正常。

直接嵌入 Word 也可以。

我的测试 midlet 具有以下源代码:

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)

我很感激任何想法。

I'm having big trouble parsing some chinese characters encoded as HTML Unicode,
embedded in XML files.

I'm using Java ME with javax.xml.parsers.SAXParser

One such character file is 词:

<test>词</test>

Info about it: http://www.isthisthingon.org/unicode/index.php?page=08&subpage=B&glyph=08BCD

But strangely 后

<test>后</test>

is working fine.

Directly embedding <test>词</test> also works.

My test midlet has the following source code:

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();
    }

}
}

It's dying with:

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)

I'd appreciate any ideas.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烧了回忆取暖 2024-12-02 02:26:30

我显然迟到了这个答案。尽管如此,郑重声明...

我几年前编写了这个解析器。在 JSR172 解析器的方法 ent 版本中,使用 Short.parseShort 将实体值转换为 char。如果该值高于 32767 Short.parseShort 会抛出 NumberFormatException。该异常在方法 ent 中被捕获并导致调用方法panic。

JSR280 中使用了更新版本的解析器。此版本应该能够正确处理高于 32767 的值。

I am obviously late with this answer. Nevertheless, for the record...

I wrote this parser a good few years ago. In method ent version of the parser from JSR172 used Short.parseShort to convert entity value to a char. If the value goes above 32767 Short.parseShort throws NumberFormatException. This exception is caught in method ent and leads to call of method panic.

More recent version of the parser was used in JSR280. This version should be able to handle values above 32767 correctly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文