- 24
- 1月
Hanny之前写了一个小软件,是采用ANSI内码的。最近,由于一些非简体中文的机器也使用到该软件,结果就变乱码了。由是乎,需要将内码转换成Unicode了。
其实,vc.net后默认都改为unicode了,毕竟国际化嘛。但是呢,VC6编写,怎么说也还是比较小巧,编译速度又比较快,所以Hanny还是比较喜欢使用vc6。
废话少讲,开始行动了。
首先是VC设置。
打开[Project]->[Setting…]对话框,在C/C++标签对话框的“Preprocesor”中去除_MBCS,加上_UNICODE,UNICODE。好了,这下就成unicode了。有这么简单吗?
编译,出错。
error LNK2001: unresolved external symbol _WinMain@16<br />
fatal error LNK1120: 1 unresolved externals<br />
Error executing link.exe.
程序入口错误,在Link页的Output类别的Entry Point里填上wWinMainCRTStartup
接下来就是字符处理了。
所有定义的常量字符串加 _T(),比如_T("Hello")
char 型指针或数组需要修改为TCHAR
然后就是字符内码转换了。
常用的字符处理转码函数
UTF-8 / ASNI 转Unicode
int name_len = MultiByteToWideChar(CP_UTF8, 0, utf8_buf, -1, NULL, 0);
MultiByteToWideChar(CP_UTF8, 0, utf8_buf, -1, unicode_buf, name_len);
把CP_UTF8换成 CP_ACP 就是 ANSI的转换了
Unicode转UTF-8 / ANSI
name_len = WideCharToMultiByte(CP_UTF8, 0, unicode_buf, -1, NULL, NULL, NULL,NULL);
WideCharToMultiByte(CP_UTF8, 0, unicode_buf, -1, utf8_buf, name_len, NULL,NULL);
把CP_UTF8换成 CP_ACP 就是 ANSI的转换了
如果是 ANSI 转 UTF-8,则需要先转为Unicode,再转UTF-8
然后就是字符函数替换(ANSI / UNICODE / TCHAR)。Hanny建议使用TCHAR系列
strlen wcslen _tcslen<br />
strchr wcschr _tcschr<br />
strrchr wcsrchr _tcsrchr<br />
strcpy wcscpy _tcscpy<br />
strcat wcscat _tcscat<br />
strcmp wcscmp _tcscmp<br />
strncmp wcsncmp _tcsncmp<br />
stricmp wcsicmp _tcsicmp<br />
strnicmp wcsnicmp _tcsnicmp<br />
_strtime _wstrtime _tstrtime<br />
_strdate _wstrtime _tstrdate <br />
<br />
printf wprintf _tprintf<br />
scanf wscanf _tscanf<br />
fopen _wfopen _tfopen<br />
fprintf fwprintf _ftprintf<br />
fscanf fwscanf _ftscanf<br />
sprintf swprintf _stprintf<br />
sscanf swscanf _stscanf<br />
vprintf vwprintf _vtprintf<br />
vfprintf vfwprintf _vftprintf<br />
vsprintf vswprintf _vstprintf<br />
_snprintf _snwprintf _sntprintf<br />
vsprintf vswprintf _vstprintf<br />
<br />
atoi _wtoi _ttoi<br />
_itoa _itow _itot<br />
atol _wtol _ttol<br />
_ltot _ltow _ltot<br />
atof _wtof _ttof
当然,以上只是一些较常用的函数。更多函数,可以查看安装目录下 VC98\Include\TCHAR.h文件。也可以直接点击下载。
然后就是memset memcpy memcmp等函数,涉及到字符时,长度len替换为len * sizeof(TCHAR)
然后就是unicode文件的创建和保存了。Hanny发现fprintf怎么都是ansi编码,最后只好用转码函数,然后用fwrite来手动保存。
然后就到编译阶段了。可能会出现缺少以下文件的错误
mfc42u.lib
mfc42ud.lib
mfcd42ud.lib
mfcn42ud.lib
mfco42ud.lib
mfcs42u.lib
mfcs42ud.pdb
点击以下下载
uafxcw.lib
uafxcwd.lib
点击以下下载
运行时又有可能出现缺少以下文件错误
mfc42u.dll
mfc42ud.dll
mfcd42ud.dll
mfcn42ud.dll
mfco42ud.dll
点击以下下载
附文件说明
Debug
MFC42D.DLL (core), MFCO42D.DLL (OLE), MFCD42D.DLL (database), MFCN42D.DLL (network), MFCS42D.LIB (static)
Release
MFC42.DLL (combined), MFCS42.LIB (static)
Unicode Debug
MFC42UD.DLL (core), MFCO42UD.DLL (OLE), MFCD42UD.DLL (database), MFCN42UD.DLL (network), MFCS42UD.LIB (static)
Unicode Release
MFC42U.DLL (combined), MFCS42U.LIB (static)
伟大的职位..
伟大的职位...