Unicode化1

本文介绍了从MBCS编码转换到Unicode编码的过程中需要注意的若干关键点,包括工程属性设置、字符串定义、字符串处理函数的选择、Windows API的使用、字符集转换函数以及在MFC中使用CString的注意事项等。作者分享了在C/C++项目中的实践经验,旨在帮助开发者顺利进行Unicode化升级。
摘要由CSDN通过智能技术生成

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
※兼容MBCS和Unicode: 根据第一步的工程属性切换来决定采用MBCS还是Unicode
是一种比较好的,切换后无需修改代码的类型定义。不过也会带来一定的麻烦(稍后 17点会针对这点进行讨论)。

 

 

3. 字符串常量定义需要在字符串两端加上L...,兼容模式的话则是_T(...)或者TEXT(...),比如:
MBCS Unicode 兼容MBCS和Unicode
"Clannad" L"Clannad" _T("Clannad")或者TEXT("Clannad")
※对于宏定义 __FILE__,如果要使得这个宏定义变成Unicode的话,必须使用TEXT(...)
采用_T(...)会产生编译错误。

 

 

4. 字符串文字数计算在MBCS中,我们采用strlen来计算一个字符串的长度,其实结果是字节数,而非文字数(纯英文数字除外)。
而在Unicode中,我们可以采用lstrlen来计算一个字符串的长度,其结果是文字数,恰好是字节数的一半。

但有时候我们需要获得变量可以容纳文字数的长度,比如LoadString(),其中最后一个参数需要我们传入
可容纳最大的文字数长度,在MBCS中,我们常常这么写sizeof(buffer),不过在Unicode中,
这样写的话就有可能会导致内存溢出,所以更好的写法是 sizeof(buffer) / sizeof(TCHAR)或者
sizeof(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值