Buffer转字符串出现LF十六进制标识10导致HTML中JS运行异常求助
问题根因
你看到的字面10替换了原本的换行位置,本质是把LF换行符转成了对应的数值字符串"10",没有保留原始的换行字符。
注:你提到的“LF的十六进制代码10”是进制混淆:LF的十六进制值是
0x0A,十进制ASCII值是10,这里出现的字面10就是把这个十进制数值转成了字符串。
- 你贴的示例中
10的出现位置正好对应原HTML的换行节点(DOCTYPE结束、html标签结束、head标签开始),完全匹配换行符的出现场景。 - 你贴的现有
scanfile代码本身没有做这个转换,要么是后续处理逻辑漏了这段,要么是你误把字节数组打印的数值结果当成了文件内容。
现有代码的额外隐患
- 你用的无参
FileReader默认走系统平台编码,没有指定原HTML头部标注的UTF-8,如果当前运行环境默认编码不是UTF-8,会出现字符乱码,甚至触发解析异常。 - 你用
System.lineSeparator()替换原文件的换行符,会把原文件的换行格式统一改成当前平台的格式,和原网页的换行格式不一致,可能导致其他格式问题。
修复方案
1. 替换读取逻辑,完整保留原HTML的字符(包括换行)
不要用readLine()(它会丢弃原换行符),直接按字符流读取完整内容,同时指定UTF-8编码:
public static String scanfile(File file) { StringBuilder sb = new StringBuilder(); // 用try-with-resources自动关闭流,避免资源泄漏 try (BufferedReader br = new BufferedReader( new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) { int c; // 逐字符读取,完整保留原文件所有内容,包括换行符 while ((c = br.read()) != -1) { sb.append((char) c); } Log.i(TAG, sb.toString()); return sb.toString(); } catch (IOException e) { e.printStackTrace(); return null; } }
2. 排查所有涉及换行符处理的逻辑
如果你的后续代码里有类似把换行符转成数值的写法,直接删掉:
// 错误写法:会输出字符串"10" sb.append(String.valueOf((int) '\n')); // 正确写法:直接追加换行字符 sb.append('\n');
如果不需要改动原换行格式,直接按上面的逐字符读取即可,不需要手动处理换行。
内容的提问来源于stack exchange,提问作者Saber bouabid
相关产品推荐
相关产品推荐

