java unicode编码文件读取问题在jdk 1.3中

时间:2011-04-17 07:11:22

标签: java

我正在使用jdk1.3用于黑莓平台。现在,当我尝试读取Unicode编码的xml文件时,我遇到了一个问题。

我的代码:

java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(path),"UTF16"));
br.readLine();

错误:

sun.io.MalformedInputException: Missing byte-order mark
    at sun.io.ByteToCharUnicode.convert(ByteToCharUnicode.java:123)
    at java.io.InputStreamReader.convertInto(InputStreamReader.java:137)
    at java.io.InputStreamReader.fill(InputStreamReader.java:186)
    at java.io.InputStreamReader.read(InputStreamReader.java:249)
    at java.io.BufferedReader.fill(BufferedReader.java:139)
    at java.io.BufferedReader.readLine(BufferedReader.java:299)
    at java.io.BufferedReader.readLine(BufferedReader.java:362)

由于

2 个答案:

答案 0 :(得分:2)

XML个文件缺少byte order mark

在JDK 1.3中,如果使用UTF-16,则为字节顺序标记is mandatory。如果您事先知道字节顺序是什么,请尝试UTF16-LE-BE

(在1.4.2及更高版本中,BOM不是强制性的。)

当然,如果您的文件根本不是UTF-16,请使用正确的编码。请参阅上面的字符编码链接。除了一小组核心编码之外,支持的实际编码是实现定义的,因此您需要检查特定JDK的文档。

文件所在的编码应该位于文件的<xml>标题中,例如:

<?xml version="1.0" encoding="THIS IS THE ENCODING YOU NEED TO USE"?>

如果文件采用单字符编码或UTF-8(没有BOM),您可以尝试使用普通US-ASCII读取第一行,它不应包含该范围之外的任何数据。解析编码字段,然后使用推导的编码重新打开文件。

这只有在您的平台明显支持实际编码时才有效。

BTW:JDK 1.3很古老。你确定那是你的版本吗? (除BOM表部分外,不会改变任何问题)

答案 1 :(得分:0)

试试这段代码:

java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(path),"Windows-1256"));
br.readLine();