Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符集与Windows_Java_Windows - Fatal编程技术网

Java字符集与Windows

Java字符集与Windows,java,windows,Java,Windows,我有一个Java程序,它在外部进程中运行msinfo 32.exe(系统信息),然后读取msinfo 32.exe生成的文件内容。当Java程序将文件内容加载到字符串中时,字符串字符是不可读的。为了使字符串可读,我必须使用String(byte[]bytes,String charsetName)创建字符串,并将charsetName设置为UTF-16。但是,在Windows2003的一个实例上运行时,只有UTF-16LE(little-endian)会生成可打印字符串 如何提前知道要使用哪种字

我有一个Java程序,它在外部进程中运行msinfo 32.exe(系统信息),然后读取msinfo 32.exe生成的文件内容。当Java程序将文件内容加载到字符串中时,字符串字符是不可读的。为了使字符串可读,我必须使用String(byte[]bytes,String charsetName)创建字符串,并将charsetName设置为UTF-16。但是,在Windows2003的一个实例上运行时,只有UTF-16LE(little-endian)会生成可打印字符串

如何提前知道要使用哪种字符编码


此外,如果您能提供有关此主题的任何背景信息,我们将不胜感激。

您无法真正了解使用了什么字符编码(除非您创建了创建正在处理的输出的工具)。您可以尝试检测预定义编码的列表,并选择不会导致任何解码错误的编码,但取决于可能匹配许多不同编码的输入。

如果您事先不知道字符编码,并且这在不同的平台上是不同的,然后,您需要以某种方式分析字节数组以尝试猜测它。有一些可用的检测算法,但对于您的应用程序来说,这可能是一种过度的杀伤力


您能否调整应用程序以生成已知的输出?不需要是一整行,只有第一个字符可以。如果是,则可以将生成的字节数组与各种编码中的预期字节数组进行比较,并进行检测。UTF8、UTF-16 big和little endian的字节数组对于简单字符串将是不同的事件。

您可以尝试使用库来猜测编码,例如我曾经使用过的编码。

一些Microsoft应用程序使用a来指示Unicode文件及其endian。我可以在我的Windows XP机器上看到导出的.NFO文件以0xFFFE开头,因此它是little endian

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_
FF FE 3C 00 3F 00 78 00 6D 00 6C 00 20 00 76 00_______
3C 00 4D 00 73 00 49 00 6E 00 66 00 6F 00 3E 00_

0D 00 0A 00 3C 00 4D 00 65 00 74 00 61 00 64 00 uuuuuu uuu uu u u u)它的工作方式是,如果有人给你一个文件并说它是UTF-16,他们希望你检查前两个字节(BOM)以确定它是大端还是小端。但是如果他们告诉你编码是UTF-16LE,这意味着没有BOM;您不需要它,因为他们已经告诉您字节顺序是little endian。Java严格遵循这些规则,这是一个真正的麻烦,因为没有其他人这样做

现代Windows操作系统的本机字符编码是UTF-16,little-endian。不幸的是,单个程序在字节顺序标记方面似乎并不一致。而且你不能一直使用UTF-16LE,因为如果BOM存在,它将作为垃圾字符传递。提前知道是使用UTF-16还是UTF-16LE的唯一方法是检查前两个字节,如McDowell所述