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?
是不是转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);
}
{
return WideCharToMultiByte(CP_ACP,NULL,unicode,-1,ascii,max_len,NULL,NULL);
}
#9
可以转的.
#10
WideCharToMultiByte:UNICODE字符(汉字)转ANSI(GB字符(汉字))
MultiByteToWideChar:ANSI(GB字符(汉字))转UNICODE字符(汉字)
不过参数不好搞的,楼主试试,搞不懂的话我再发一段代码给你。
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。
楼主试一下:
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
有几个现成的函数的。其实若不是很需要节约空间,还是用UNICODE比较好,你转来转去会遇到很多的问题,数据库的编码形式有时也要整,并且若弄的不好,会经常出现乱码的问题。所以若不是特别需要节约存储资源,还是用UNICODE比较好。
希望对你有帮助
#15
“现在由于通信的需要,要把传送过来的Unicode码转成中文存进数据库”
--楼主可能是做一个项目,与通信有关,要把通信来的数据(比如通过短信或GPRS等收发来的数据)接收到,并保存在一个数据库中,通信的数据包括中文,要能把接收过来的通信数据显示出来(其中包括中文)。
而绝大多数的通信数据是UNOCIDE编码,不是我们电脑上常见的编码方式(Windows的发展方向是末来全部用UNICODE编码)。
楼主是想问如何把接收过来的数据(UNICODE编码格式)转换成我们普通电脑能用的数据(ANSI编码格式)
#16
我们普通电脑其实使用的是utf16。
#17
呵呵,比较全,学习了
#18
这句话放在十几年前说是对的。从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);
{
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
#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?
是不是转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);
}
{
return WideCharToMultiByte(CP_ACP,NULL,unicode,-1,ascii,max_len,NULL,NULL);
}
#9
可以转的.
#10
WideCharToMultiByte:UNICODE字符(汉字)转ANSI(GB字符(汉字))
MultiByteToWideChar:ANSI(GB字符(汉字))转UNICODE字符(汉字)
不过参数不好搞的,楼主试试,搞不懂的话我再发一段代码给你。
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。
楼主试一下:
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
有几个现成的函数的。其实若不是很需要节约空间,还是用UNICODE比较好,你转来转去会遇到很多的问题,数据库的编码形式有时也要整,并且若弄的不好,会经常出现乱码的问题。所以若不是特别需要节约存储资源,还是用UNICODE比较好。
希望对你有帮助
#15
“现在由于通信的需要,要把传送过来的Unicode码转成中文存进数据库”
--楼主可能是做一个项目,与通信有关,要把通信来的数据(比如通过短信或GPRS等收发来的数据)接收到,并保存在一个数据库中,通信的数据包括中文,要能把接收过来的通信数据显示出来(其中包括中文)。
而绝大多数的通信数据是UNOCIDE编码,不是我们电脑上常见的编码方式(Windows的发展方向是末来全部用UNICODE编码)。
楼主是想问如何把接收过来的数据(UNICODE编码格式)转换成我们普通电脑能用的数据(ANSI编码格式)
#16
我们普通电脑其实使用的是utf16。
#17
呵呵,比较全,学习了
#18
这句话放在十几年前说是对的。从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);
{
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
你最好还是检查一下你数据库用的字符集