java 使用registry-3.1.3读取注册表字符串中文的乱码问题? 真心求助!!!急求!!正确的,分全给!

hc334521 2013-05-29 06:33:23
代码:

String reg="Wow6432Node\\RuanMei\\TweakCube3";
try {
RegistryKey software = Registry.HKEY_LOCAL_MACHINE
.openSubKey("SOFTWARE");
RegistryKey subKey = software.openSubKey(reg);

String subKey1Value = subKey.getStringValue("ExeName");
String subKey2Value = subKey.getStringValue("Install_Dir");

System.out.println(subKey1Value);
System.out.println(subKey1Value);
subKey.closeKey();
} catch (NoSuchKeyException e) {
e.printStackTrace();
} catch (RegistryException e) {
e.printStackTrace();
}

本来结果是:E:\必备软件\美化工具\魔方\TweakCube3\
但乱码结果却是:E:\????????\????????\????\TweakCube3
...全文
229 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanhaopoi 2014-10-24
  • 打赏
  • 举报
回复
根据上面的提示编写的java代码,可以将String乱码改为有效String,另外我想请教一下registry在修改注册表时有是怎么做的? public static String encode(String str){ char []c=str.toCharArray(); byte []b=new byte[c.length]; for(int i=0;i<c.length;i++){ b[i]=(byte) c[i]; } String newStr=null; try { newStr=new String(b,"gbk"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } return newStr; }
kittaaron 2013-06-01
  • 打赏
  • 举报
回复
引用 7 楼 hc334521 的回复:
[quote=引用 6 楼 AARON7744 的回复:] 只读不写的话, 这里有答案 http://bbs.csdn.net/topics/360158652
我知道哪里出了问题,说出来真是难以启齿, 首先了解原理了就不难解决,这个dll在读取注册表是采取二进制,在一个循环里使用 int mark=xx.read()的方式,然后读取的int放入一个byte数组,然后直接使用这个byte[] 来new 一个string,这样就导致单纯的转变string的编码方式还是会出错,于是我们可以将这个String subKey2Value = subKey.getStringValue("Install_Dir");中的subKey2Value还原为char数组,然后放入一个byte数组里,然后使用gbk编码方式重新将这个byte数组构造成string就完美解决中文了乱码问题。[/quote] 楼主把那几行代码贴出来?我当时也尝试直接了在JAVA代码里从byte[]恢复,但是好像拿到的byte[]已经是错误的,所以判断是在JNI调用返回的值就已经不正确了! subKey2Value还原为char数组,然后放入一个byte数组里 -- 这句话好像没太明白,怎么从一个char数组里恢复一个byte数组的???
hc334521 2013-05-31
  • 打赏
  • 举报
回复
引用 5 楼 kittaaron 的回复:
[quote=引用 4 楼 hc334521 的回复:] 求助牛人,都说这是最牛的论坛,为什么简单的得不到解答,难得也得不到解答,难道会的人都over了吗?不禁使我对csdn产生怀疑
专门下了你说的这个东西试一下,这个包的实现对包含中文值的KEY应该有问题,我看这个好像有源代码,你直接看一下源代码改一下吧。应该不是使用的问题,可能C语言的实现就有问题。[/quote] 已经解决,将这个string重构了一下
hc334521 2013-05-31
  • 打赏
  • 举报
回复
引用 6 楼 AARON7744 的回复:
只读不写的话, 这里有答案 http://bbs.csdn.net/topics/360158652
我知道哪里出了问题,说出来真是难以启齿, 首先了解原理了就不难解决,这个dll在读取注册表是采取二进制,在一个循环里使用 int mark=xx.read()的方式,然后读取的int放入一个byte数组,然后直接使用这个byte[] 来new 一个string,这样就导致单纯的转变string的编码方式还是会出错,于是我们可以将这个String subKey2Value = subKey.getStringValue("Install_Dir");中的subKey2Value还原为char数组,然后放入一个byte数组里,然后使用gbk编码方式重新将这个byte数组构造成string就完美解决中文了乱码问题。
-AJ- 2013-05-30
  • 打赏
  • 举报
回复
只读不写的话, 这里有答案 http://bbs.csdn.net/topics/360158652
kittaaron 2013-05-29
  • 打赏
  • 举报
回复
引用 4 楼 hc334521 的回复:
求助牛人,都说这是最牛的论坛,为什么简单的得不到解答,难得也得不到解答,难道会的人都over了吗?不禁使我对csdn产生怀疑
专门下了你说的这个东西试一下,这个包的实现对包含中文值的KEY应该有问题,我看这个好像有源代码,你直接看一下源代码改一下吧。应该不是使用的问题,可能C语言的实现就有问题。
hc334521 2013-05-29
  • 打赏
  • 举报
回复
求助牛人,都说这是最牛的论坛,为什么简单的得不到解答,难得也得不到解答,难道会的人都over了吗?不禁使我对csdn产生怀疑
hc334521 2013-05-29
  • 打赏
  • 举报
回复
引用 2 楼 kittaaron 的回复:
楼主的RegistryKey software = Registry.HKEY_LOCAL_MACHINE .openSubKey("SOFTWARE");是哪来的?我怎么找不到这2个东西。。第三方的库?
很明显是的java 使用registry-3.1.3读取注册表,还有一个dll的动态链接库
kittaaron 2013-05-29
  • 打赏
  • 举报
回复
楼主的RegistryKey software = Registry.HKEY_LOCAL_MACHINE .openSubKey("SOFTWARE");是哪来的?我怎么找不到这2个东西。。第三方的库?
hc334521 2013-05-29
  • 打赏
  • 举报
回复
难道没有人会???高手别隐藏嘛。急求急求

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧