问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

...下用c语言调用mysql查询语句后返回的汉字显示乱码,有什么办法吗...

发布网友 发布时间:2022-04-29 02:10

我来回答

2个回答

懂视网 时间:2022-05-07 12:16

mysqlc语言

跪求大神指导。。

图片说明

热心网友 时间:2022-05-07 09:24

这是因为UTF8编码格式的问题,你需要进行字符转换。
首先用MultiByteToWideChar(CP_UTF8,0,lpszBuffer,-1,(LPWSTR)pUnicode,size); 把UTF8转成宽字节文字,
然后用WideCharToMultiByte(936,0,(LPWSTR)pUnicode,-1,lpszContext,size,NULL,NULL); 转换成CP936编码的中文汉字。
只能帮你找个思路,具体的函数调用细节我也不计啦,自己查win32api的手册吧。可以参考下面的例子。

VC6.0 UCS2(unicode) 与 GBK(gb2312) UTF(utf-8)格式互转
#include <string>
#include <stdio.h>
#include "windows.h"
// 把UTF-8转换成Unicode
void UTF_8ToUnicode(WCHAR* pOut,char *pText)
{
char* uchar = (char *)pOut;

uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);
uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);

return;
}
// Unicode 转换成UTF-8
void UnicodeToUTF_8(char* pOut,WCHAR* pText)
{
// 注意 WCHAR高低字的顺序,低字节在前,高字节在后
char* pchar = (char *)pText;

pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
pOut[2] = (0x80 | (pchar[0] & 0x3F));

return;
}

// 把Unicode 转换成 GB2312
void UnicodeToGB2312(char* pOut,unsigned short uData)
{
WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL);
return;
}

// GB2312 转换成 Unicode
void Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer)
{
::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
return;
}

//GB2312 转为 UTF-8
void GB2312ToUTF_8(CString& pOut,char *pText, int pLen)
{
char buf[1024];
char* rst = new char[pLen + (pLen >> 2) + 2];

memset(buf,0,1024);
memset(rst,0,pLen + (pLen >> 2) + 2);

int i = 0;
int j = 0;
while(i < pLen)
{
//如果是英文直接复制就可以
if( *(pText + i) >= 0)
{
rst[j++] = pText[i++];
}
else
{
WCHAR pbuffer;
Gb2312ToUnicode(&pbuffer,pText+i);

UnicodeToUTF_8(buf,&pbuffer);

unsigned short int tmp = 0;
tmp = rst[j] = buf[0];
tmp = rst[j+1] = buf[1];
tmp = rst[j+2] = buf[2];

j += 3;
i += 2;
}
}
strcpy(&rst[j],"\0");

//返回结果
pOut = rst;
delete []rst;

return;
}

//UTF-8 转为 GB2312
void UTF_8ToGB2312(CString &pOut, char *pText, int pLen)
{
char * newBuf = new char[pLen];
char Ctemp[4];
memset(Ctemp,0,4);

int i =0;
int j = 0;

while(i < pLen)
{
if(pText[i] > 0)
{
newBuf[j++] = pText[i++];
}
else
{
WCHAR Wtemp;
UTF_8ToUnicode(&Wtemp,pText + i);

UnicodeToGB2312(Ctemp,Wtemp);

newBuf[j] = Ctemp[0];
newBuf[j + 1] = Ctemp[1];

i += 3;
j += 2;
}
}
strcpy(&newBuf[j],"\0");

pOut = newBuf;
delete []newBuf;

return;
}

CString UTF8_Encode(LPTSTR strUnicode)
{
long TLen ;
CString UTF8_EncodeLong ;

TLen = CString(strUnicode).GetLength() ;

if(TLen == 0)
{
return CString(strUnicode);
}

long lngBufferSize ;
long lngResult ;

//Set buffer for longest possible string.
lngBufferSize = TLen * 3 + 1 ;
char *bytUtf8 = new char[lngBufferSize] ;

//Translate using code page 65001(UTF-8).

lngResult = WideCharToMultiByte(CP_UTF8, 0, (unsigned short*)strUnicode, TLen, bytUtf8, lngBufferSize, NULL, 0) ;

bytUtf8[lngResult] = NULL ;

return CString(bytUtf8) ;
}

/*************************************************************************/

CString URLEncode(CString sIn)
{
CString sOut;
const int nLen = sIn.GetLength() + 1;
register LPBYTE pOutTmp = NULL;
LPBYTE pOutBuf = NULL;
register LPBYTE pInTmp = NULL;
LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
BYTE b = 0;
//alloc out buffer

pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3 - 2);//new BYTE [nLen * 3];
if(pOutBuf)
{
pInTmp = pInBuf;
pOutTmp = pOutBuf;
// do encoding

while (*pInTmp)
{
if(isalnum(*pInTmp))
*pOutTmp++ = *pInTmp;
else
if(isspace(*pInTmp))
*pOutTmp++ = '+';
else
// if(*pInTmp<=127)
// *pOutTmp++ = *pInTmp;
// else
{
*pOutTmp++ = '%';

*pOutTmp++ = toHex(*pInTmp>>4);

*pOutTmp++ = toHex(*pInTmp%16);
}

pInTmp++;

}

*pOutTmp = '\0';

//sOut=pOutBuf;

//delete [] pOutBuf;

sOut.ReleaseBuffer();

}

sIn.ReleaseBuffer();

return sOut;

}
使用///////////////////////////////////

CString memname=“汉字";
GB2312ToUTF_8(memname,mem_name,TCBUFSIZE);
URLEncode(memname)便是所要的结果"“%E6%B1%89%E5%AD%97"了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
word绘制施工进度横道图!表格好了,中间的横道杂往上打!!!急急急_百 ... 如何用 SWOT 模型进行自我分析? 求朋友圈、公众号文案排版工具? 写文案用什么软件 回复文案的软件推荐 学习挖掘机需要什么条件 学挖机新手从哪里学 挖掘机学习都学什么 新手学开挖掘机先学哪些 手工麦芽糖怎么做? 麦芽糖怎么做小零食 如何取消电信的综合信息服务费? 如何取消电信综合信息服务费 从win10装回win7后密码不对 如何有效指导七年级学生写好话题作文比 怎样才能写好 初中话题作文?有什么方法?要注意什么? 初中话题作文怎么写 话题作文怎么写 初中 上海海洋大学是几本学校 上海海洋大学在山东招收几本啊 分数是多少啊? 初中生如何写好话题作文课件 上海海洋大学、广东海洋大学、浙江海洋学院分别属于几本大学??答案越详细越好~~ 上海海洋大学几本 上海海洋大学是二本还是三本?江西文科生大概要考多少分才能上? 上海海洋大学是几本大学 花生酥 麻仔、黄老五哪个好吃 谁知道厦门特产资料 金门三宝哪三宝? 福建有什么特产啊?介绍一下? 花生酥做法 有关花生酥的来历? 我原来是win10系统,把硬盘去了以后变成了win7,最坑的是忘记密码了,咋破解呢 oppo手机打开程序经常闪退 有什么去黄山的路线,可以游完所有景点的? C语言连接mysql 中文字符乱码问题 民生保险在哪里查询? 电脑w10的密码忘了,跟w7一样能改吗 去安徽黄山旅游怎么安排?安徽黄山交通路线指南 中国电信的综合信息服务费怎么解除 闪退怎么解决oppo 我投了民生人寿保险分红怎么查 c语言中存入文档变成乱码怎么解决?不知道为什么出现了乱码 总经理秘书的职责 中国电信中的综合信息服务费有什么作用,可以取消吗? C语言程序设计,程序可以运行,但是保存的文件是乱码?求大神 跪求些女扮男装或装丑进入学校的动漫,小说,电视剧或电影 总经理秘书的工作职责 电信的“综合信息服务费”怎么取消? win10改win7怎么改回来 怎么取消综合信息服务费10000的 去黄山游玩路线指导