【问题标题】:Why is the first character of the first line of a file in windows a 0?为什么windows中文件第一行的第一个字符是0?
【发布时间】:2013-06-04 11:01:16
【问题描述】:

所以我正在阅读 Java 中的纯文本文件,我想确定哪些行以“abc”开头。我做了以下事情:

字符集 charset = StandardCharsets.UTF_8; BufferedReader br = Files.newBufferedReader(file.toAbsolutePath(), charset); 字符串线; while ((line = br.readLine()) != null) { 如果(line.startsWith(“abc”)){ // 做一点事 } }

但如果文件的第一行是“abcd”,则不匹配。通过调试,我发现第一个字符是 0(不可打印字符),因此它不会匹配。为什么呢?如何可靠地识别哪些行以“abc”开头?

编辑:也许我应该指出我正在使用记事本创建文件

【问题讨论】:

  • 读完行后可以修剪不可打印的字符。
  • @SazzadurRahaman trim() 只删除空白字符,它对不可打印的字符没有任何作用
  • 我不是在谈论 String.trim(),我是在谈论编写您的自定义修剪! :P
  • 您使用的字符集 (StandardCharsets.UTF_8) 是否正确?确保使用 UTF-8 编码保存文件。
  • @SazzadurRahaman 对,但我想知道为什么这个角色会出现。

标签: java windows utf-8 nio


【解决方案1】:

Windows 在 UTF-8 方面存在一些问题,因此它是 UTF-8 BOM (Byte Order Mark) 的重度用户。

如果我的猜测是正确的,那么前三个字节将是(十六进制):0xef、0xbb、0xbf。

鉴于,例如,Excel 创建带有 BOM 前缀的 UTF-8 CSV 文件,如果记事本也能做到这一点,我一点也不感到惊讶...

编辑:毫不奇怪,似乎是这样:见here

【讨论】:

  • 正确!这是一个问号(而不是我所说的 0)。非常感谢!
  • 但他正在使用 UTF-8 阅读器阅读,因此 BOM 将是单个 char,值为 0xFEFF。如果然后将其输出到(例如)LATIN-1 控制台,他会看到?
  • @StephenC 呃,是的,我的意思是前三个字节,抱歉...已修复
  • @Thiago 如果你要处理大量从 Windows 发出的文件,你可能还会遇到 UTF-16...PowerShell 默认使用这种编码写入文件!
  • @StephenC 注意这是一个 UTF-8 BOM,注意 UTF-16 或 UTF-32
猜你喜欢
  • 1970-01-01
  • 2015-08-06
  • 2021-08-20
  • 2022-11-30
  • 1970-01-01
  • 2020-01-04
  • 2023-03-05
  • 2022-06-10
  • 1970-01-01
相关资源
最近更新 更多