JNA 调用 dll 文件 乱码问题

来源:互联网 发布:p2p软件开发 编辑:程序博客网 时间:2024/05/17 20:26

//乱码,我都不好意思写出来.写出来就好象告之天下,我好菜.呵呵.

 

最近有需要调用win32的api来做些东西,本来打算用jni的,可是,jni也太复杂了。好久就有jnative的实现了。也用了一下,调用的方法还是有些复杂(setParatement示例中int参数也需要以String形式传入,而且还得手动转),知道偶然看到jna,感觉用起来还是挺应手的,完全的java写法.

 

于是有了helloworld.目标调用user32.dll弹出一个对话框.


 

完成时间12点.然后没事写了个中文.完了。出事了.乱码了.

 

现在依然没搞明白.3个小时啊.暂时解决的方法就是把java文件的编码设置为gb2312.

可是我还是想java文件是utf-8的编码.(解决方法见问题2)

这问题哪好意思上坛子里说啊,只有自己摸了.于是又发现了不是问题的问题.

//应该输出gb2312编码就不乱了,可是new String("中文".getBytes("gb2312"))也无效.

 

user32.MessageBoxA(0, "没没没没泉中文没", "中文",0);

按说乱码都乱了也好.可偶然发现,"没"字不乱,"中文"就乱了。查字符映射表,"没"的附近"泉"也不乱.

乱码以后的字符也很可爱 ,有名的 "锟斤拷".以前也只是经常见罢了.难道这里也有缘由?为什么好多字乱码以后就变成了"锟斤拷"?

 

原因见百度百科了。熬不动了。改天再想这个问题吧.

 

三天后:

 

现在的问题是:

1 .java 文件的编码会和结果有关系么?

.java文件最终会编译为.class文件.他们生成的.class文件一样么?

在命令行下编译,javac使用-encoding来指定源文件的编码,eclipse下会自动根据文件编码编译正确的class.

即文件中定义个String str = "中文";

无论采用何种编码(当然要支持中文,否则写出来也不认识),只要用对应的编码编译,生成的class是一样的.这些字符在class文件中以utf-8的格式保存.

2 eclipse 下和命令行下同一段代码结果不同.

简单例子:System.out.println(System.getProperty("file.encoding");//打印文件编码的系统变量.

在命令行下执行,取到的是系统默认的编码.而在eclpise下执行竟然能读到该java文件的真实编码.

初看也不可思议,难道编译成的class不一样,或者携带了文件编码等信息?通过问题1的研究,发现没有携带文件编码的信息,而且编译成的class也一样.问题出在哪里?

eclipse中run -- run configurations -- common -- console encoding

该项会根据文件的编码自动变换,所以不同编码的.java文件执行的结果不同了.并不是class不同.

另一种说法,运行的时候,eclipse会自动设置file.encoding为文件编码.(表面现象,未加证实)

同时也找到了上面为什么将文件设置为gbk或者gb2312可以正常输出中文了.如果文件是utf-8编码的,需要运行环境是gbk,直接设置console encoding为gbk编码就可以了.

 

引申的问题:

1 new String("中文".getBytes("gb2312"));该语句做了什么?

api中说明 构造一个新的 String,方法是使用平台的默认字符集解码字节的指定数组。

该语句通过"中文"的gb2312字节码生成一个新的字符串,新的字符串采用的编码通过原代码可以看到取的是

Charset.defaultCharset().name();

再看defaultCharset()方法,同样取的是系统属性file.encoding

该句在命令行下取的操作系统默认编码,我机器上取到gb18030.在eclipse下,由于eclipse运行时候设置过file.encoding,取到的也是文件的编码.

 

 2 new String("中文".getBytes("utf-8"),"gbk");

该句的意思并不是生成中文的gbk编码的字符串.而是生成一个乱码.

"中文".getBytes("utf-8") 返回"中文"二字utf-8编码的byte数组.结果为e4,b8,ad,e6,96,87 一共六个长度

String(byte[] bytes, String charsetName)

api说明 构造一个新的 String,方法是使用指定的字符集解码指定的字节数组。

gbk是2字节表示一个汉字,所以结果就是--  涓枃

查看"涓"的gbk编码为e4b8