嗯,错误消息告诉您原因:它没有读取字节顺序标记。字节顺序标记位于文件的开头。如果没有读取字节顺序标记,那么UTF-16解码器将无法知道字节的顺序。显然,它是在您第一次读取时(而不是在您打开文件时)偷懒地执行的,否则它会假设表示seek()
正在启动新的UTF-16流。
如果您的文件没有BOM表,那绝对是问题所在,打开文件时应指定字节顺序(请参见下面的#2)。否则,我看到两个潜在的解决方案:
查找之前,请先读取文件的前两个字节以获取BOM。您似乎说这没有用,这表明搜索后可能期望有新的UTF-16流,因此:
打开文件时,通过使用utf-16-le
或utf-16-be
作为编码来明确指定字节顺序。