JAVA工程源文件是UTF8的,现在要调用dll传消息,而DLL只能接收GBK编码的消息,这种情况怎么办?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA工程源文件是UTF8的,现在要调用dll传消息,而DLL只能接收GBK编码的消息,这种情况怎么办?相关的知识,希望对你有一定的参考价值。
工程文件太多没法转换为GBK的编码
参考技术A 你可以自己写一个编码转换函数,将UTF-8转换为GBK的,UTF-8 是用三个字节表示一个汉字,GBK是用两个字节。具体的对应关系网上很多,自己查一个吧。很好写的,我以前写过。 参考技术B 转码就行了比如字符串s是GBK的则可以用
String ss=new String(s.getBytes("GBK"),"UFT-8");
把s转成UTF-8编码的。追问
感谢回复,这个问题困扰我很久了。
我的JAVA源文件不是GBK的,s也就是UTF8的, 假设要传给DLL的消息是 "测试" ,这个消息必须是GBK的,DLL才能接收。JAVA中能用代码临时修改字符集吗?不然我的先把测试两个的GBK转为UTF8的编码 "娴嬭瘯"传给DLL,DLL才能正确知道是”测试“两个字,而我要传的消息是动态的,那就每次传都得转换了,这样不现实,DLL我们也不能修改。
java中编译后字符编码就确定了,不能再更改,除非重新编译。
如果是你想传给DLL 你的java是UTF的话就
String s=”测试“;
String ss=new String(s.getBytes("UTF-8"),"GBK");
然后把ss传给DLL DLL接收的就是GBK编码的测试两个字。
至于每次转换麻烦完全可以自己写一个转换字符串编码的方法用来处理就行了
比如
public String utfToGbk(String s)
return new String(s.getBytes("UTF-8"),"GBK");
每次就只用s=utfToGbk(s);就把s转成GBK的了。
仔细研究了一下
String ss=new String(s.getBytes("UTF-8"),"GBK");
这种方法是错误的。不能误导大家。
感谢各位回复
用的JNA调用的DLL,我用eclipse (源文件GBK编码) 调用是没问题的,后来用NETBEANS去调同样的代码就不行了,而NETBEANS的源文件编码为UTF8。如果改为GBK去调也是没问题的,问题是NETBEANS工程的其他文件原来都是按UTF8编码的,换成GBK所有的中文得全部修改,这个几乎是没法办到的。不知道哪位高手碰到过这种情况。实在不行只能重新包一下他们的DLL了。
你代码里面用了中文?这个应该不困难,可以通过转码,把所有文件转换成UTF-8编码,最简单的用文本编辑器就能做到,但是一个一个来还是挺麻烦的。我觉得你自己写个批量的编码转换,搞定了再导入进NetBeans
追问NETBEAN中的工程是用SWING写的,中间很多控件有中文。如果是直接在NETBEAN中调整源的编码从UTF-8至GBK 很多中文会变为乱码。而且文件太多,真是不敢转换!你说的批量转还没试过,可以一试,非常感谢你的回复
追答如果数据量很大,用java那个很2的i18n还是值得的,虽说麻烦,可以有效地对付各种编码问题,并且维护起来也容易
参考技术D dll文件是自己写的吗?对dll这个比较感兴趣 但是不会 求解!追问不是自己写的 是一个短信猫动态库,厂家提供的。
VS2010的MFC程序如何调用动态库文件(dll文件)?放在system32中仍然编译无法打开d
VS2010的MFC程序如何调用动态库文件(dll文件)?放在system32中仍然编译无法打开dll,求大神指点
dll这个东西,只要放到编译时会去访问的任意路径上即可。比如你现在是Debug,你可以放到Debug文件夹或者工程文件夹;
你现在是Release, 你可以放到Release文件夹或者工程文件放到System32无法访问可能说明你的程序根本不需要去访问System32,虽然这不太可能。
当然我可以认为楼主是在隐式调用dll, 显示调用失败系统不会报错。如果 你是要隐式调用已经知道库在何处和其中函数定义的dll,可以在你的FingerMatch.cpp开始的时候写上:
#ifdef _DEBUG
#pragma comment(lib, "..(路径)fp.lib")
#else
#pragma comment(lib, "..(路径)fp.lib")
#endif
然后包含一下fp.h,这个应该是已经做了。那应该不会有什么问题了。
值得注意的是编译时dll只会打开一次,比如你在Debug文件夹下有一个fp.dll,在工程文件夹下也有一个fp.dll,那么编译时使用的是Debug文件夹下的dll,因为它先被找到。
如果上面说的都没用,那么你显式调用吧 参考技术A 请问楼主解决了吗?我遇到同样的问题 参考技术B 和执行档放在同一目录呢?追问
是放到生成的Debug文件和Release文件中?还是放到VS2010的MFC资源管理器Debug和Release中?
以上是关于JAVA工程源文件是UTF8的,现在要调用dll传消息,而DLL只能接收GBK编码的消息,这种情况怎么办?的主要内容,如果未能解决你的问题,请参考以下文章
JAVA如何调用C语言编写的程序,并且传参数,读取返回结果?