4

我有一个 GB3212 编码(中文)的文件。文件从这里下载http://lingua.mtsu.edu/chinese-computing/statistics/char/list.php?Which=MO与 Windows 下的 wget 一样,并存储到 ModernChineseCharacterFrequencyList.html 文件名中。

下面的代码演示了 Java 如何无法以一种方式读取它并以另一种方式结束。

即,如果Scannerscanner = new Scanner(src, "GB2312")代码创建是行不通的。如果Scanner是用scanner = new Scanner(new FileInputStream(src), "GB2312")then 创建的,它就可以工作。

分隔符模式线仅显示故障仍然存在的另一个选项。

public static void main(String[] args) throws FileNotFoundException {

    File src = new File("ModernChineseCharacterFrequencyList.html");
    //Pattern frequencyDelimitingPattern = Pattern.compile("<br>|<pre>|</pre>");

    Scanner scanner;
    String line;

    //scanner = new Scanner(src, "GB2312"); // does NOT work
    scanner = new Scanner(new FileInputStream(src), "GB2312"); // does work


    //scanner.useDelimiter(frequencyDelimitingPattern);

    while(scanner.hasNext()) {
        line = scanner.next();
        System.out.println(line);
    }

}

这是故障还是设计行为?

更新

当代码正常工作时,它只会读取所有令牌直到结束。当它不起作用时,它会取消大约在中间的读取,没有异常或错误消息。

没有发现断裂处的奇点。也没有像 2^32 这样的“神奇”数字出现。

更新 2

最初该行为是在带有 Sun 的 JavaSE 1.6 的 Windows 上发现的

现在,在带有 OpenJDK 1.6.0_23 的 Ubuntu 上也发现了相同的行为

4

1 回答 1

1

我现在无法测试我的答案,但 JDK 6 文档会根据您使用的 API 为编码建议不同的规范名称:io 或 nio

JDK 6 支持的编码

也许,您应该使用“EUC_CN”而不是使用“GB2312”,这是建议的 Java I/O 规范名称。

于 2012-01-05T13:50:05.927 回答