Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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
Linux文件大小、java.nio和CP1252多字节字符集_Linux_Character Encoding_Codepages_Java.nio.file_Cp1252 - Fatal编程技术网

Linux文件大小、java.nio和CP1252多字节字符集

Linux文件大小、java.nio和CP1252多字节字符集,linux,character-encoding,codepages,java.nio.file,cp1252,Linux,Character Encoding,Codepages,Java.nio.file,Cp1252,我有一个Cp1252文件,我想读取为二进制文件 来自终端的ls-al显示其大小为10字节 但是,此java代码段报告了18个字节: Path path = Paths.get(lfile); SeekableByteChannel sbc = Files.newByteChannel(path, StandardOpenOption.READ); long size = sbc.size(); 该文件包含6个ascii字符+4个Cp1252字符。我的理解是,10字节是文件系统中此文件的正确大小

我有一个Cp1252文件,我想读取为二进制文件

来自终端的
ls-al
显示其大小为10字节

但是,此java代码段报告了18个字节:

Path path = Paths.get(lfile);
SeekableByteChannel sbc = Files.newByteChannel(path, StandardOpenOption.READ);
long size = sbc.size();
该文件包含6个ascii字符+4个Cp1252字符。我的理解是,10字节是文件系统中此文件的正确大小。 还有一个细节:尝试使用以下命令读取文件内容时:

byte[] fileContents = Files.readAllBytes(path);
我得到18个字节,因为每个Cp1252字符加载为3个字节。在文件中,我有不同的Cp1252字符,缓冲区显示它们都是相同的-这肯定是不正确的

有两个问题困扰着我:

  • 这个文件在一个文件系统中实际占用多少字节

  • 假设它有10个字节长,如何将其读取为“原始”

  • 更新: 我用一个小C程序尝试了同样的方法,结果和预期的一样:从文件中读取10个字符,其中4个是Cp1252,它们的值都不同

    int main() {
        char fileName[200] = "test.x10";
        FILE *fp = fopen(fileName, "r");
        while(1) {
            int c = fgetc(fp);
            if( feof(fp) )
                break ;
            printf("%i ", c);
        }
        fclose(fp);
    }
    
    更新2:

    test.x10包含Cp1252个字符:
    aöaäaüaßbb

    上面给出的C代码打印出来:
    972469722897252972239898

    Files.readAllBytes读取:
    97 239 191 189 97 239 191 189 97 239 191 189 97 239 191 189 97 239 191 189 98

    以下是hextump:

    hexdump -C test.x10
    00000000  61 f6 61 e4 61 fc 61 df  62 62                   |a.a.a.a.bb|
    

    CP1252不是多字节字符集。它是Latin-1或ISO-8859-1字符集的Windows变体。但是如果你想要相关的答案,你应该显示文件中10个字节的十六进制值。在java中尝试完整的绝对路径。“rb”不会改变任何东西。C按预期工作,这也由HEXTUMP的结果证实。只有Java行为不端。我使用绝对路径,我只是在代码片段中简化了它。