Unicode化
作者:斑鸠
更新时间:2009/08/21
为了程序编写方便,根除乱码问题等等需求,很多新项目都采用了Unicode编码。
同时,不少使用MBCS多字节编码的旧项目为了升级,也有了转向Unicode编码的意向。
不过,从MBCS升级到Unicode并不是无缝的,该问题的复杂程度,取决于代码总量和
代码的编写质量。
本文是作者在一个C/C++项目中的一些经验之谈,希望对有此需求的读者带来帮助。
1. 工程属性切换在VC6.0中,切换到Unicode没有直接的选项可以选,需要在宏定义中添加 UNICODE和 _UNICODE,
同时需要 去除MBCS宏定义。另外,如果生成的是exe的程序的话,还需要定义入口函数名 wWinMainCRTStartup。
在VC2003以及之后的IDE环境中,有直接选者使用UNICODE还是MBCS的选项,无需添加宏定义。
【设定场所】
VC6.0: 主菜单 - 工程 - 设定 - C/C++标签(共通) - 宏定义
主菜单 - 工程 - 设定 - 链接标签(输出) - 入口符号
VC2003: 主菜单 - 工程 - 属性 - 共通 - 字符集
2. 字符串定义
MBCS | Unicode | 兼容MBCS和Unicode |
char | WCHAR | TCHAR |
char* | LPWSTR | LPTSTR |
LPSTR | LPWSTR | LPTSTR |
const char* | LPCWSTR | LPCTSTR |
LPCSTR | LPCWSTR | LPCTSTR |
是一种比较好的,切换后无需修改代码的类型定义。不过也会带来一定的麻烦(稍后 17点会针对这点进行讨论)。
3. 字符串常量定义需要在字符串两端加上L...,兼容模式的话则是_T(...)或者TEXT(...),比如:
MBCS | Unicode | 兼容MBCS和Unicode |
"Clannad" | L"Clannad" | _T("Clannad")或者TEXT("Clannad") |
采用_T(...)会产生编译错误。
4. 字符串文字数计算在MBCS中,我们采用strlen来计算一个字符串的长度,其实结果是字节数,而非文字数(纯英文数字除外)。
而在Unicode中,我们可以采用lstrlen来计算一个字符串的长度,其结果是文字数,恰好是字节数的一半。
但有时候我们需要获得变量可以容纳文字数的长度,比如LoadString(),其中最后一个参数需要我们传入
可容纳最大的文字数长度,在MBCS中,我们常常这么写sizeof(buffer),不过在Unicode中,
这样写的话就有可能会导致内存溢出,所以更好的写法是 sizeof(buffer) / sizeof(TCHAR)或者
sizeof(