怎样把Unicode代码转换成中文字符

mxgd123 2010-01-22 09:13:30
现在由于通信的需要,要把传送过来的Unicode码转成中文存进数据库。。。。个人是新手。。。需要详细的资料。。。有代码更好。。谢谢啦
...全文
1794 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
superlee19 2010-01-24
  • 打赏
  • 举报
回复
你最好还是检查一下你数据库用的字符集
mxgd123 2010-01-23
  • 打赏
  • 举报
回复
可能就是unicode转GB吧
whz_time 2010-01-23
  • 打赏
  • 举报
回复
int Wcs2Mbs(const WCHAR *wcsin, CHAR * mbsout, int outBufSize, unsigned long nCodePage)
{
int nWcsLen = ((int)wcslen(wcsin)+1) * 2;
int nSize = nWcsLen < outBufSize ? nWcsLen : outBufSize;
if(!IsValidCodePage(nCodePage)) nCodePage = GetOEMCP(); // GetACP();
return WideCharToMultiByte(nCodePage,
0,
wcsin,
-1,
mbsout,
nSize,
NULL,
NULL );
}

int Mbs2Wcs(const CHAR *mbsin, WCHAR *wcsout, int outBufSize, unsigned long nCodePage)
{
int nWcsLen = (int)strlen(mbsin)+1;
int nSize = nWcsLen < outBufSize ? nWcsLen : outBufSize;
if(!IsValidCodePage(nCodePage)) nCodePage = GetOEMCP(); // GetACP();
return MultiByteToWideChar(nCodePage,
0,
mbsin,
-1,
wcsout,
nSize+1);
}


UNICODE -> ANSI:
Wcs2Mbs(wcsin, mbsout, outBufSize, 936);

ANSI -> UNICODE:
Mbs2Wcs(mbsin, wcsout, outBufSize, 936);


gamedragon 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yhp1888 的回复:]
而绝大多数的通信数据是UNOCIDE编码,不是我们电脑上常见的编码方式(Windows的发展方向是末来全部用UNICODE编码)。
[/Quote]
这句话放在十几年前说是对的。从2000/XP开始,Windows就已经转为UNICODE了,只不过为了跟98以前的程序兼容才保留了多字符集的支持,实际内部全是UNICODE。
xwsn007 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yhp1888 的回复:]
另外,你的数据库如果支持UNICODE的话就不用转了,2000年以后出的基本都支持,Windows的word、execl、记事本都支持。
楼主试一下:

1、你用Windows下的记事本新建立一个文件,输入一段中文,你可以在任何时间双击打开它,可以看懂里面的中文。
2、再打开该记事本,选“文件->另存为”,在对话框的“编码”中选“Unicode”,保存,你可以在任何时间双击打开它,可以看懂里面的中文。

第1步建立的是ANSI编码文件,保存的汉字是GB2312/GBK汉字(ANSI编码),每个汉字占2个字节,数字字母是ANSI字符,每个字符占1个字节。

第2步建立的是UNICODE编码文件,保存的汉字是GB18030汉字(UNICODE编码),每个汉字占2个字节,数字字母是UNICODE字符,每个字符占2个字节。

如果你的项目是手工操作,可以按上述方法保存数据。也可以通过软件代码存入execl或其它数据库。

GB是指“国标”,中国国家标准。GB2312只有6763个汉字,GBK有21003个汉字,GB18030支持27533个汉字,包括全球所有汉字,与UNICODE标准统一。

五笔字型86版有很多字打不出来,是因为王永民的时代只有6763个ANSI汉字,你可以用全拼输入法,用鼠标右击输入法状态框,选“设置”,再选“检索字符集”的GBK,可以打出2.1万个汉字。

Windows 2K以后,都支持GBK,俗称“大字符集”,2002年以后支持GB18030,但你没有字库,还是显示不出2.7万个汉字来。我的电脑可以显示汉字“㐃”,你的不能,因为你没有安装相应的字库(如“新宋体-18030”),在本网页也不能显示,因为这个版本的IE我还没有看到在哪设置字体。

另外,你做通信,不少通信不是用标准的UNICODE编码,比如手机短信是UTF-8编码,是UNICODE编码的一个变种,记事本支持UTF-8。

[/Quote]

呵呵,比较全,学习了
用户 昵称 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yhp1888 的回复:]
我们普通电脑能用的数据(ANSI编码格式)

[/Quote]
我们普通电脑其实使用的是utf16。
yhp1888 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 chenchao0124 的回复:]
没搞懂什么意思
[/Quote]
“现在由于通信的需要,要把传送过来的Unicode码转成中文存进数据库”
--楼主可能是做一个项目,与通信有关,要把通信来的数据(比如通过短信或GPRS等收发来的数据)接收到,并保存在一个数据库中,通信的数据包括中文,要能把接收过来的通信数据显示出来(其中包括中文)。

而绝大多数的通信数据是UNOCIDE编码,不是我们电脑上常见的编码方式(Windows的发展方向是末来全部用UNICODE编码)。

楼主是想问如何把接收过来的数据(UNICODE编码格式)转换成我们普通电脑能用的数据(ANSI编码格式)
超gogo 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 huabinsir 的回复:]
int UnicodeToASCII(wchar * unicode, char * ascii, int max_len)
{
    return WideCharToMultiByte(CP_ACP,NULL,unicode,-1,ascii,max_len,NULL,NULL);
}
[/Quote]
有几个现成的函数的。其实若不是很需要节约空间,还是用UNICODE比较好,你转来转去会遇到很多的问题,数据库的编码形式有时也要整,并且若弄的不好,会经常出现乱码的问题。所以若不是特别需要节约存储资源,还是用UNICODE比较好。
希望对你有帮助
chenchao0124 2010-01-23
  • 打赏
  • 举报
回复
没搞懂什么意思
yhp1888 2010-01-23
  • 打赏
  • 举报
回复
尽管还有高手在,但我相信我的回复楼主可以结贴了。
yhp1888 2010-01-23
  • 打赏
  • 举报
回复
另外,你的数据库如果支持UNICODE的话就不用转了,2000年以后出的基本都支持,Windows的word、execl、记事本都支持。
楼主试一下:

1、你用Windows下的记事本新建立一个文件,输入一段中文,你可以在任何时间双击打开它,可以看懂里面的中文。
2、再打开该记事本,选“文件->另存为”,在对话框的“编码”中选“Unicode”,保存,你可以在任何时间双击打开它,可以看懂里面的中文。

第1步建立的是ANSI编码文件,保存的汉字是GB2312/GBK汉字(ANSI编码),每个汉字占2个字节,数字字母是ANSI字符,每个字符占1个字节。

第2步建立的是UNICODE编码文件,保存的汉字是GB18030汉字(UNICODE编码),每个汉字占2个字节,数字字母是UNICODE字符,每个字符占2个字节。

如果你的项目是手工操作,可以按上述方法保存数据。也可以通过软件代码存入execl或其它数据库。

GB是指“国标”,中国国家标准。GB2312只有6763个汉字,GBK有21003个汉字,GB18030支持27533个汉字,包括全球所有汉字,与UNICODE标准统一。

五笔字型86版有很多字打不出来,是因为王永民的时代只有6763个ANSI汉字,你可以用全拼输入法,用鼠标右击输入法状态框,选“设置”,再选“检索字符集”的GBK,可以打出2.1万个汉字。

Windows 2K以后,都支持GBK,俗称“大字符集”,2002年以后支持GB18030,但你没有字库,还是显示不出2.7万个汉字来。我的电脑可以显示汉字“㐃”,你的不能,因为你没有安装相应的字库(如“新宋体-18030”),在本网页也不能显示,因为这个版本的IE我还没有看到在哪设置字体。

另外,你做通信,不少通信不是用标准的UNICODE编码,比如手机短信是UTF-8编码,是UNICODE编码的一个变种,记事本支持UTF-8。
yhp1888 2010-01-23
  • 打赏
  • 举报
回复
WideCharToMultiByte:UNICODE字符(汉字)转ANSI(GB字符(汉字))
MultiByteToWideChar:ANSI(GB字符(汉字))转UNICODE字符(汉字)
不过参数不好搞的,楼主试试,搞不懂的话我再发一段代码给你。
shenzhentom 2010-01-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 huabinsir 的回复:]
int UnicodeToASCII(wchar * unicode, char * ascii, int max_len)
{
    return WideCharToMultiByte(CP_ACP,NULL,unicode,-1,ascii,max_len,NULL,NULL);
}
[/Quote]

可以转的.
huabinsir 2010-01-23
  • 打赏
  • 举报
回复
int UnicodeToASCII(wchar * unicode, char * ascii, int max_len)
{
return WideCharToMultiByte(CP_ACP,NULL,unicode,-1,ascii,max_len,NULL,NULL);
}
xiaoyuchen3v 2010-01-22
  • 打赏
  • 举报
回复
不知道LZ是啥意思,U 支持中文的……
是不是转GB?
xwsn007 2010-01-22
  • 打赏
  • 举报
回复
也可在保存之前处理一下,读取显示的时候就不用管了

str = L"汉字";
char szANSIString[MAX_PATH];
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,str,-1,szANSIString,sizeof(szANSIString),NULL,NULL);
//保存szANSIString
...
xwsn007 2010-01-22
  • 打赏
  • 举报
回复
1,3楼说的没错
oyljerry 2010-01-22
  • 打赏
  • 举报
回复
Unicode本身就支持中文,然后你存入数据库,读取数据库出来的时候,记得读出来的是Unicode中文就好了
WaistCoat11 2010-01-22
  • 打赏
  • 举报
回复
int nLen = lstrlenW(wszUnicode);
char *pszAnsi = new char[nLen+1];
WideCharToMultiByte(CP_ACP, 0, wszUnicode, -1, pszAnsi, nLen, NULL, NULL);
delete[] pszAnsi;
gamedragon 2010-01-22
  • 打赏
  • 举报
回复
不用转,直接存就是了。UNICODE的意思就是把全球所有文字统一编号,当然也包括中文。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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