求教MySQL5数据库VC读取中文显示问号

求教MySQL5数据库VC读取中文显示问号,第1张

补充:

你用什么读写MySQL?VC一般是用C API吧。

mysql_query(&m_mysql,"set names \'GBK\'")

就是在你初始化并连接到数据库之后提交的查询语句

你公司的要求就是读取数据库的内容并显示出来?

如果你之前没用VC写过读写MySQL的程序的话最好看下MySQL的开发文档。下面代码是从我的代码里面找的一部分读写数据库的。

通过C API连接数据库分为初始化、设置选项、连接到数据库3步:

MYSQL mysql// 数据库句柄

MYSQL *pmysql// 验证连接用句柄

// 初始化数据库

if (mysql_init(&mysql) == NULL)

{

// 初始化数据库错误

return

}

// 设置MySQL选项

mysql_options(&m_mysql,MYSQL_READ_DEFAULT_GROUP,"IMServer")

// 连接到数据库

// mysql_real_connect(数据库句柄,主机名,用户名,密码,数据库名,端口,命名管道,客户端标记)

pmysql = mysql_real_connect(&m_mysql,"localhost","root",NULL,"imdb",3306,NULL,0)

// 检测是否连接成功

if (pmysql == &m_mysql)

{

// 连接失败

return

}

如果连接成功,就可以进行数据库的读写了:

读写方式就跟平常查询数据库一样,返回的结果放在一个结果集变量中。

步骤是:

1.mysql_query()提交查询语句

2.mysql_use_result()获取上一次查询的结果集

3.mysql_fetch_row()从结果集中获取单项内容

4.mysql_free_result()释放结果集

下面的例子查询表imdb_users中UserID为abc的条目:

假设前面已经连接到了数据库,句柄为mysql

///////////////////////

MYSQL_RES *result // 存放结果集

MYSQL_ROW row // 存放结果集中单个条目

unsigned long *nLength // 存放结果字段的长度

char ch_query[100] // 存放ANSI查询语句

// 查询语句

CString strQuery = L"select * from imdb_users where UserID = \'abc\'"

// 用前面说的封装API的函数将查询语句转换为ANSI

UnicodeToAnsi(ch_query,strQuery)

// 提交查询语句

if(mysql_query(&mysql,ch_query)!=0)

{

// 查询出错,返回

return

}

// 读取结果集

if(!(result=mysql_use_result(&m_mysql)))

{

// 读取结果集失败

return

}

// 获取查询到的表的每列的信息

if ((row=mysql_fetch_row(result)) == NULL)

{

// 没有找到数据

mysql_free_result(result) // 释放结果集内存

return

}

// 获取结果字段的长度

nLength = mysql_fetch_lengths(result)

// 获取结果集中第一个字段的内容

WCHAR wsz[100]

MultiByteToWideChar(CP_ACP,0,row[1],nLength[1]+1,wsz,sizeof(wsz))

// 显示内容

CString str

str.Format(L"%s",wsz)

AfxMessageBox(str)

mysql_free_result(result)// 释放结果集内存

===============================================

我以前也碰到了这个问题。

我看了下之前的代码,但不记得哪些代码是用来解决这个问题了。

大概是先要

mysql_query(&m_mysql,"set names \'GBK\'")

设置查询用的编码,我这用的GBK。

这样返回的结果集的编码跟数据库的编码就一样了。这样一来得到的字符串应该不是问号,而是乱码了。

然后很重要的一点,要根据你程序使用的编码决定是否要转换字符。如果你的程序使用了Unicode,要么就一定要进行转换,我之前搞了半天只获得了第一个字符,后来才觉得是Unicode的问题。因为MySQL返回的字符是单字节,Unicode是双字节,直接显示肯定不匹配。转换是用MultiByteToWideChar()和WideCharToMultiByte()这两个Windows API,前者ANSI >Unicode, 后者Unicode >ANSI。

ANSI >Unicode:

WCHAR ch[200]

MultiByteToWideChar(CP_ACP,0,row[0],nLength[0]+1,ch,sizeof(ch))

===============================================

Unicode >ANSI:

// 将CString的内容转换为ANSI

void DbProcess::UnicodeToAnsi( char *pstr, CString str )

{

WCHAR *pwtrQuery

pwtrQuery = (WCHAR *)(LPCTSTR)str

WideCharToMultiByte(CP_ACP,0,pwtrQuery,-1,pstr,strlen(pstr),NULL,NULL)

}

使用方法:

char ch[200]

CString str = L"Unicode charactor"

UnicodeToAnsi(ch, str)

mysql用c和c++写的,你在make的时候需要c的库

去下载这两个包,

libncurses5-dev

libmysqlclient15-dev

这是因为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"了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/7630072.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存