我从网上找了个代码是将网页保存为mht文件的,当参数输入为英文时程序运行正常,但是输入中文时就变成了乱码。我的中文数据是从oracle数据库中读出,由java的jni从string类型转为const char*类型,然后显示出来就变成了乱码。小弟在c方面几乎一无所知,希望大家帮我的时候能贴出代码,谢谢!
源代码如下:
#include "windows.h"
#include <tchar.h>
#include <stdio.h>
#include "extended_SaveMht.h"
#import "d:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "EndOfFile")
#import <cdosys.dll> no_namespace rename("EOF", "EndOfFile")
JNIEXPORT void JNICALL Java_extended_SaveMht_SaveWholePage
(JNIEnv * env, jobject obj, jstring pageUrl, jstring fileName){
CoInitialize(NULL);
{
const char *page_url;
const char *save_filename;
page_url = env->GetStringUTFChars(pageUrl,0);
save_filename = env->GetStringUTFChars(fileName,0);
printf("%s",save_filename); //输出乱码了 T_T
IMessagePtr iMsg(__uuidof(Message));
IConfigurationPtr iConf(__uuidof(Configuration));
iMsg->Configuration = iConf;
try
{
iMsg->CreateMHTMLBody(
page_url,
cdoSuppressNone,
"domain\\username",
"password");
}
catch(_com_error err)
{
// handle exception
}
_StreamPtr pStream=iMsg->GetStream();
pStream->SaveToFile( save_filename,
adSaveCreateOverWrite);
env -> ReleaseStringUTFChars(pageUrl, page_url);
env -> ReleaseStringUTFChars(fileName, save_filename);
}
CoUninitialize();
}
UTF需要转换,如
char str [ 256 ] = {0xE6,0x9c, 0xAc, 0xE5 ,0} ; //一段UTF-8编码
WCHAR* strA;
int i= MultiByteToWideChar ( CP_UTF8 , 0 ,(char*) str ,-1 ,NULL,0);
strA = new WCHAR[i];
MultiByteToWideChar ( CP_UTF8 , 0 ,( char * ) str, -1, strA , i );
strA[0] = 0xE7;
i= WideCharToMultiByte(CP_ACP,0,strA,-1,NULL,0,NULL,NULL);
char *strB=new char[i];
WideCharToMultiByte (CP_ACP,0,strA,-1,strB,i,NULL,NULL);
//strB即为所求