【问题标题】:Character digit not true when read from UTF-8 file从 UTF-8 文件读取时,字符数字不正确
【发布时间】:2015-03-04 20:43:16
【问题描述】:

所以我使用扫描仪来读取文件。但是我不明白,如果文件是 UTF-8 文件,并且在迭代文件时读取的当前行包含一个数字,则方法 Character.isDigit(line.charAt(0)) 返回 false。但是,如果文件不是 UTF-8 文件,则该方法返回 true。

这里有一些代码

File theFile = new File(pathToFile);
Scanner fileContent = new Scanner(new FileInputStream(theFile), "UTF-8");
while(fileContent.hasNextLine())
{
    String line = fileContent.nextLine();
    if(Character.isDigit(line.charAt(0)))
    {
         //When the file being read from is NOT a UTF-8 file, we get down here
    }

当使用调试器并查看line 字符串时,我可以看到在这两种情况下(无论是否为UTF-8 文件),字符串似乎都包含相同的数字。为什么会这样?

【问题讨论】:

  • 你调试了吗? line.charAt(0) 没有按照您的预期返回什么字符?
  • line.charAt(0) 在使用 UTF-8 文件时不返回任何内容,这就解释了为什么 Character.isDigit 当然不返回 true。但是为什么line.charAt(0) 什么都不返回呢?
  • 没有发生。也就是说,您通过读取一个文件获得的String 与您通过读取另一个文件获得的不一样。一旦你把这条线变成String 形式,Java 就不会知道或关心其中的chars 来自哪里。调试时,查看chars 的整数值,而不是它们的图形表示,当然也不是整个字符串的图形表示。
  • String.charAt(0) 只能通过抛出异常无法返回任何内容。当您在调试器中查看它们时,我很难想象这与似乎包含相同内容的字符串保持一致。此外,它与 Character.isDigit(line.charAt(0)) 返回 false 不一致,正如您所声称的那样。
  • 您的文件是否包含(意外)BOM?

标签: java utf-8 filestream chars


【解决方案1】:

最终通过交换 cmets 发现,您的文件包含 BOM。这通常不推荐用于 UTF-8 文件,因为 Java 不期望它并将其视为数据。

所以你有两个选择:

  1. 如果您可以控制文件,请在没有 BOM 的情况下复制它

  2. 如果不存在,则检查文件是否存在 BOM 并将其删除,然后再继续其他操作。

这是一些开始的代码。它宁愿跳过而不是删除 BOM。随意修改。它在我几年前写的一些测试实用程序中:

private static InputStream filterBOMifExists(InputStream inputStream) throws IOException {
        PushbackInputStream pushbackInputStream = new PushbackInputStream(new BufferedInputStream(inputStream), 3);
        byte[] bom = new byte[3];
        if (pushbackInputStream.read(bom) != -1) {
            if (!(bom[0] == (byte) 0xEF && bom[1] == (byte) 0xBB && bom[2] == (byte) 0xBF)) {
                pushbackInputStream.unread(bom);
            }
        }
        return pushbackInputStream;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-26
    • 2011-10-23
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多