C++ utf8-GB转换问题

vajet 2016-08-05 03:42:35
我写了段代码,用在DLL中
这段代码是为了测试utf8与gb转换,当执行这段代码时,excel就会崩溃

DLLIMPORT __stdcall char* HiWorld(char* a)
{
//char* b;
strcpy(a,"这是一个测试!");
a=G2U(a);
a=U2G(a);
return a;
}

而注释G2U及U2G两行后,就能正常运行,如:

DLLIMPORT __stdcall char* HiWorld(char* a)
{
//char* b;
strcpy(a,"这是一个测试!");
//a=G2U(a);
//a=U2G(a);
return a;
}

请问什么原因?
...全文
155 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
关键在这里:
    
//a=G2U(a);
//a=U2G(a);
传进来的a,在传进来之前,是一个数组,还是一个char*类型的指针。 如果是数组,那么就相当于改变数组首地址,这个肯定是不行的。

char* HiWorld(char* a) {
    strcpy(a,"This is a test");   //这样做是可以的。
    a = "abc";    //这样做事很危险的。
    return a;
}

int main() {
	char a[MAX_PATH];
	HiWorld(a);
	return 0;
}
你应当把a=G2U(a) 改成strcpy之类的代码。
vajet 2016-08-07
  • 打赏
  • 举报
回复


DLLIMPORT __stdcall char* HiWorld(char* a)
{
	char* b;
	strcpy(a,"这是一个测试");
	MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION);

//转换成utf8 开始
int len = MultiByteToWideChar(CP_ACP, 0, a, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_ACP, 0, a, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
strcpy(a,str);
////转换成utf8 结束


	//a=G2U(b,a);
	//U2G(b,a);
	return a;
}

我把G2U的代码直接copy到程序里,则可以正常运行 请大神解答!!!
引用 7 楼 zjq9931 的回复:
关键在这里:
    
//a=G2U(a);
//a=U2G(a);
传进来的a,在传进来之前,是一个数组,还是一个char*类型的指针。 如果是数组,那么就相当于改变数组首地址,这个肯定是不行的。

char* HiWorld(char* a) {
    strcpy(a,"This is a test");   //这样做是可以的。
    a = "abc";    //这样做事很危险的。
    return a;
}

int main() {
	char a[MAX_PATH];
	HiWorld(a);
	return 0;
}
你应当把a=G2U(a) 改成strcpy之类的代码。
感谢你,你这个解答可以使代码正常运行! 经过昨晚 测试,我也发现C++传递值要用strcpy
vajet 2016-08-06
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
我知道是C++写的DLL程序中return 语句出错,就是找不到原因 注释掉G2U,U2G两句,就可以正常运行,带上这两句,就崩溃
vajet 2016-08-06
  • 打赏
  • 举报
回复
引用 2 楼 woshirenjun12 的回复:
excel会崩溃,表格崩溃了?
你好,整个Excel表,提示''Microsoft Excel 已经停止工作'有个按钮'关闭程序'
vajet 2016-08-06
  • 打赏
  • 举报
回复
引用 1 楼 zjq9931 的回复:
这个要看看你的G2U和U2G的函数说明。。。 返回值是做什么用的。 传入参数是做什么用的。

//utf8 to gb

char* U2G(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
//strcpy(gb,str);
return str;
}

U2G是网上找到把UTF8转成GB的代码
赵4老师 2016-08-05
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
IT_拖油瓶 2016-08-05
  • 打赏
  • 举报
回复
excel会崩溃,表格崩溃了?
  • 打赏
  • 举报
回复
这个要看看你的G2U和U2G的函数说明。。。 返回值是做什么用的。 传入参数是做什么用的。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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