我有一个 Java 程序,它在外部进程中运行 msinfo32.exe(系统信息),然后读取 msinfo32.exe 生成的文件内容。当Java程序将文件内容加载到String中时,String中的字符是不可读的。为了使字符串可读,我必须使用 String(byte[] bytes, String charsetName) 创建字符串并将 charsetName 设置为 UTF-16。但是,当在 Windows2003 的一个实例上运行时,只有 UTF-16LE(小端)会产生可打印的字符串。
我怎样才能提前知道要使用哪种字符编码?
此外,如果您能提供有关此主题的任何背景信息,我们将不胜感激。
最佳答案
某些 Microsoft 应用程序使用 byte-order mark指示 Unicode 文件及其字节顺序。我可以在我的 Windows XP 机器上看到导出的 .NFO 文件以 0xFFFE 开头,因此它是小端。
FF FE 3C 00 3F 00 78 00 6D 00 6C 00 20 00 76 00 __<_?_x_m_l_ _v_
65 00 72 00 73 00 69 00 6F 00 6E 00 3D 00 22 00 e_r_s_i_o_n_=_"_
31 00 2E 00 30 00 22 00 3F 00 3E 00 0D 00 0A 00 1_._0_"_?_>_____
3C 00 4D 00 73 00 49 00 6E 00 66 00 6F 00 3E 00 <_M_s_I_n_f_o_>_
0D 00 0A 00 3C 00 4D 00 65 00 74 00 61 00 64 00 ____<_M_e_t_a_d_
此外,我建议您改用 Reader用于解码文件的实现而不是 String 构造函数;这有助于避免您读取半个字符的问题,因为它被截断了,因为它位于字节数组的末尾。
关于Java 字符集和 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/457655/