gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:55:36 25 4
gpt4 key购买 nike

在我的应用程序中,我正在读取注册表以获取所有时区名称。它在本地英语操作系统机器上运行良好。

但是对于中文本地操作系统,它显示“?????????”。

我正在使用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[] 字节数组中,我得到了垃圾字符,因此无论我使用什么编码将该字节数组转换为字符串,我都只得到垃圾字符。任何人都可以建议我,对这种方法进行哪些更改才能使其正常工作?

最佳答案

我假设你的意思是 the hack in this answer它使用私有(private)的、未记录的、特定于实现的 API。

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

return (valb != null ? new String(valb).trim() : null);

在 Windows 上,默认编码可能是旧编码 - "ANSI" code page .

您需要弄清楚数据的编码和 provide it explicitlyString(byte[],Charset) 构造函数中或切换到已记录的 API - 例如使用RegQueryValueExWJNA .

正如 Octopus 在评论中指出的那样,使用 System.out 也很容易将字符变成垃圾,因为它也使用有损旧编码。

关于java - java中从注册表中读取unicode字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22778863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com