Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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中从注册表读取unicode字符_Java - Fatal编程技术网

在java中从注册表读取unicode字符

在java中从注册表读取unicode字符,java,Java,在我的应用程序中,我读取注册表以获取所有时区名称。 它与母语为英语的操作系统机器配合良好 但对于中国本土操作系统来说,它显示的是“?????” 我使用的是WinRegistry.java,这是java中可用于读取注册表的公共文件 下面是从注册表读取字节的方法,但该字节仅包含垃圾字符 private static String readString(Preferences root, int hkey, String key, String value) throws IllegalArg

在我的应用程序中,我读取注册表以获取所有时区名称。 它与母语为英语的操作系统机器配合良好

但对于中国本土操作系统来说,它显示的是“?????”

我使用的是WinRegistry.java,这是java中可用于读取注册表的公共文件

下面是从注册表读取字节的方法,但该字节仅包含垃圾字符

private static String readString(Preferences root, int hkey, String key, String value)
    throws IllegalArgumentException, IllegalAccessException,
    InvocationTargetException 
  {
    int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
        new Integer(hkey), toCstr(key), new Integer(KEY_READ) });
    if (handles[1] != REG_SUCCESS) {
      return null; 
    }
    byte[] valb = (byte[]) regQueryValueEx.invoke(root, new Object[] {
        new Integer(handles[0]), toCstr(value) });
    regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
    return (valb != null ? new String(valb).trim() : null);
  }
在valb[]字节数组中,我得到的是垃圾字符,因此无论我使用何种编码将该字节数组转换为字符串,我只得到垃圾字符。 有谁能告诉我,这个方法中有什么变化可以让它正常工作吗?

我想你的意思是使用一个私有的、未记录的、特定于实现的API

此代码使用将返回的字节转换为字符:

return (valb != null ? new String(valb).trim() : null);
在Windows上,默认编码很可能是一种遗留编码—一种

您需要在
字符串(字节[],字符集)
构造函数中找出数据的编码,或者切换到有文档记录的API,例如使用with


正如八达通在评论中指出的那样,使用
系统也很容易将字符变成垃圾。out
因为它也使用有损的传统编码。

检查这一个,哪里有问号?在控制台中?我正在检索字符串,并将其显示为下拉列表。在下拉列表中我可以看到问号,但我已经检查了valb[]中的字节。它本身包含的字节是“???????”。所以不管我们用什么编码都没用..啊,好的。当Java的Preferences API在Windows注册表中存储Unicode值时,它会进行自己的Unicode转义——它从来没有打算成为一般的注册表读取器类型。java的黑客攻击滥用了这个API的内部结构。这可能解释了为什么在某些区域设置下阵列数据损坏。我将研究如何使用本机代码。