Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从UTF-8文件读取时字符数字不正确_Java_Utf 8_Filestream_Chars - Fatal编程技术网

Java 从UTF-8文件读取时字符数字不正确

Java 从UTF-8文件读取时字符数字不正确,java,utf-8,filestream,chars,Java,Utf 8,Filestream,Chars,所以我用扫描仪来读取文件。但是我不明白,如果文件是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"); wh

所以我用扫描仪来读取文件。但是我不明白,如果文件是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
    }

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

通过交换评论,您的文件包含一个BOM表。这通常不建议用于UTF-8文件,因为Java并不期望它,而是将它视为数据

因此,您有两种选择:

  • 如果您控制该文件,请在不使用BOM表的情况下复制该文件

  • 如果没有,则检查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;
        }
    

    你调试过了吗?当使用UTF-8文件时,
    line.charAt(0)
    返回什么字符?
    line.charAt(0)
    不会返回任何内容,这解释了为什么character.isDigit当然不会返回true。但是为什么
    line.charAt(0)
    不返回任何内容呢?这并没有发生。也就是说,从一个文件读取的
    字符串与从另一个文件读取的字符串不同。一旦您将行放入
    String
    表单中,Java就不知道或不关心其中的
    char
    s来自何处。调试时,请查看
    char
    s的整数值,而不是它们的图形表示,当然也不是整个字符串的图形表示。
    string.charAt(0)
    只能通过引发异常才能返回任何内容。我很难想象,当你在调试器中查看字符串时,它如何与看起来包含相同内容的字符串保持一致。此外,它与
    Character.isDigit(line.charAt(0))
    返回的
    false
    不一致,正如您声称的那样。您的文件是否(意外地)包含BOM?