• 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文件。也可以直接点击下载。

TCHAR.zip (提取码: rhzq, 5.3 KB, 下载次数: 1968, 最后修改: 2014-01-24 21:41)

然后就是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
点击以下下载

lib.zip (提取码: rhzq, 868.8 KB, 下载次数: 2192, 最后修改: 2016-11-18 06:54)

uafxcw.lib
uafxcwd.lib
点击以下下载

uafxcw.zip (提取码: rhzq, 5230.9 KB, 下载次数: 1782, 最后修改: 2014-01-24 21:43)

运行时又有可能出现缺少以下文件错误
mfc42u.dll
mfc42ud.dll
mfcd42ud.dll
mfcn42ud.dll
mfco42ud.dll
点击以下下载

dll.zip (提取码: rhzq, 1218 KB, 下载次数: 2182, 最后修改: 2014-01-24 21:42)

附文件说明
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)

» Tags:vc6, unicode, 内码, ansi, utf8

» 这篇文章共有2条评论,你可以在文章底部留下你的评论

  1. Real Estate Says:
    2014-01-27 05:39

    伟大的职位..

  2. Real Estate Says:
    2014-02-02 09:08

    伟大的职位...

发表评论