Linux文件大小、java.nio和CP1252多字节字符集
我有一个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字节是文件系统中此文件的正确大小
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字符,缓冲区显示它们都是相同的-这肯定是不正确的
有两个问题困扰着我:
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行为不端。我使用绝对路径,我只是在代码片段中简化了它。