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

时间:2021-11-17 07:45:01
现在由于通信的需要,要把传送过来的Unicode码转成中文存进数据库。。。。个人是新手。。。需要详细的资料。。。有代码更好。。谢谢啦

20 个解决方案

#1


不用转,直接存就是了。UNICODE的意思就是把全球所有文字统一编号,当然也包括中文。

#2


int nLen = lstrlenW(wszUnicode);
char *pszAnsi = new char[nLen+1];
WideCharToMultiByte(CP_ACP, 0, wszUnicode, -1, pszAnsi, nLen, NULL, NULL);
delete[] pszAnsi;

#3


Unicode本身就支持中文,然后你存入数据库,读取数据库出来的时候,记得读出来的是Unicode中文就好了

#4


1,3楼说的没错

#5


也可在保存之前处理一下,读取显示的时候就不用管了

str = L"汉字";  
char szANSIString[MAX_PATH];  
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,str,-1,szANSIString,sizeof(szANSIString),NULL,NULL); 
//保存szANSIString
...

#6


不知道LZ是啥意思,U 支持中文的……
  是不是转GB?

#7


可能就是unicode转GB吧

#8


int UnicodeToASCII(wchar * unicode, char * ascii, int max_len) 
{
    return WideCharToMultiByte(CP_ACP,NULL,unicode,-1,ascii,max_len,NULL,NULL);

#9


引用 8 楼 huabinsir 的回复:
int UnicodeToASCII(wchar * unicode, char * ascii, int max_len)
{
    return WideCharToMultiByte(CP_ACP,NULL,unicode,-1,ascii,max_len,NULL,NULL);
}


可以转的.

#10


WideCharToMultiByte:UNICODE字符(汉字)转ANSI(GB字符(汉字))
MultiByteToWideChar:ANSI(GB字符(汉字))转UNICODE字符(汉字)
不过参数不好搞的,楼主试试,搞不懂的话我再发一段代码给你。

#11


另外,你的数据库如果支持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。

#12


尽管还有高手在,但我相信我的回复楼主可以结贴了。

#13


没搞懂什么意思

#14


引用 8 楼 huabinsir 的回复:
int UnicodeToASCII(wchar * unicode, char * ascii, int max_len)
{
    return WideCharToMultiByte(CP_ACP,NULL,unicode,-1,ascii,max_len,NULL,NULL);
}

有几个现成的函数的。其实若不是很需要节约空间,还是用UNICODE比较好,你转来转去会遇到很多的问题,数据库的编码形式有时也要整,并且若弄的不好,会经常出现乱码的问题。所以若不是特别需要节约存储资源,还是用UNICODE比较好。
希望对你有帮助

#15


引用 13 楼 chenchao0124 的回复:
没搞懂什么意思

“现在由于通信的需要,要把传送过来的Unicode码转成中文存进数据库”
--楼主可能是做一个项目,与通信有关,要把通信来的数据(比如通过短信或GPRS等收发来的数据)接收到,并保存在一个数据库中,通信的数据包括中文,要能把接收过来的通信数据显示出来(其中包括中文)。

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

楼主是想问如何把接收过来的数据(UNICODE编码格式)转换成我们普通电脑能用的数据(ANSI编码格式)

#16


引用 15 楼 yhp1888 的回复:
我们普通电脑能用的数据(ANSI编码格式)

我们普通电脑其实使用的是utf16。

#17


引用 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。


呵呵,比较全,学习了

#18


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

这句话放在十几年前说是对的。从2000/XP开始,Windows就已经转为UNICODE了,只不过为了跟98以前的程序兼容才保留了多字符集的支持,实际内部全是UNICODE。

#19


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);


#20


你最好还是检查一下你数据库用的字符集

#1


不用转,直接存就是了。UNICODE的意思就是把全球所有文字统一编号,当然也包括中文。

#2


int nLen = lstrlenW(wszUnicode);
char *pszAnsi = new char[nLen+1];
WideCharToMultiByte(CP_ACP, 0, wszUnicode, -1, pszAnsi, nLen, NULL, NULL);
delete[] pszAnsi;

#3


Unicode本身就支持中文,然后你存入数据库,读取数据库出来的时候,记得读出来的是Unicode中文就好了

#4


1,3楼说的没错

#5


也可在保存之前处理一下,读取显示的时候就不用管了

str = L"汉字";  
char szANSIString[MAX_PATH];  
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,str,-1,szANSIString,sizeof(szANSIString),NULL,NULL); 
//保存szANSIString
...

#6


不知道LZ是啥意思,U 支持中文的……
  是不是转GB?

#7


可能就是unicode转GB吧

#8


int UnicodeToASCII(wchar * unicode, char * ascii, int max_len) 
{
    return WideCharToMultiByte(CP_ACP,NULL,unicode,-1,ascii,max_len,NULL,NULL);

#9


引用 8 楼 huabinsir 的回复:
int UnicodeToASCII(wchar * unicode, char * ascii, int max_len)
{
    return WideCharToMultiByte(CP_ACP,NULL,unicode,-1,ascii,max_len,NULL,NULL);
}


可以转的.

#10


WideCharToMultiByte:UNICODE字符(汉字)转ANSI(GB字符(汉字))
MultiByteToWideChar:ANSI(GB字符(汉字))转UNICODE字符(汉字)
不过参数不好搞的,楼主试试,搞不懂的话我再发一段代码给你。

#11


另外,你的数据库如果支持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。

#12


尽管还有高手在,但我相信我的回复楼主可以结贴了。

#13


没搞懂什么意思

#14


引用 8 楼 huabinsir 的回复:
int UnicodeToASCII(wchar * unicode, char * ascii, int max_len)
{
    return WideCharToMultiByte(CP_ACP,NULL,unicode,-1,ascii,max_len,NULL,NULL);
}

有几个现成的函数的。其实若不是很需要节约空间,还是用UNICODE比较好,你转来转去会遇到很多的问题,数据库的编码形式有时也要整,并且若弄的不好,会经常出现乱码的问题。所以若不是特别需要节约存储资源,还是用UNICODE比较好。
希望对你有帮助

#15


引用 13 楼 chenchao0124 的回复:
没搞懂什么意思

“现在由于通信的需要,要把传送过来的Unicode码转成中文存进数据库”
--楼主可能是做一个项目,与通信有关,要把通信来的数据(比如通过短信或GPRS等收发来的数据)接收到,并保存在一个数据库中,通信的数据包括中文,要能把接收过来的通信数据显示出来(其中包括中文)。

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

楼主是想问如何把接收过来的数据(UNICODE编码格式)转换成我们普通电脑能用的数据(ANSI编码格式)

#16


引用 15 楼 yhp1888 的回复:
我们普通电脑能用的数据(ANSI编码格式)

我们普通电脑其实使用的是utf16。

#17


引用 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。


呵呵,比较全,学习了

#18


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

这句话放在十几年前说是对的。从2000/XP开始,Windows就已经转为UNICODE了,只不过为了跟98以前的程序兼容才保留了多字符集的支持,实际内部全是UNICODE。

#19


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);


#20


你最好还是检查一下你数据库用的字符集

#21