c++字符处理引出的问题
时间:2010-08-25 来源:2012
字符编码的问题
C/C++发展的过程很长,早期的字符都是Multibyte的形式,后期为了处理多国语言增加了Unicode,因此比JAVA和C#这些后来者内置的字符是Unicode的支持,在处理时需要注意。
I18n Internationalization:国际化的简写
l10n localization: 本地化的简写
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vccrt/html/ee536a04-3558-4729-8e10-6dabcde055fd.htm Internationalization
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vccrt/html/4e573c05-8800-468b-ae5f-76ff7409835e.htm Data Type Mappings
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vccrt/html/a03de0db-8118-4bd9-a03f-640e8dfc5ed3.htm A Sample Generic-Text Program
字符初始化
Genreic [和编译类别有关,Unicode编译时是Unicode] |
_TCHAR buff[_MAX_PATH] = {TEXT("hello")}; |
Unicode |
wchar_t *wmsg = L"Is"; |
MBCS |
char *amsg = "Reversed"; |
字符转换
Windows |
WideCharToMultiByte MultiByteToWideChar 当然MFC ATL和相关的库有相关的转换辅助函数,可在这些源代码中找到 (如c:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\atlcomcli.h 中A2WBSTR) |
iconv |
GNU开源的组件,多种字符编码的转换 跨平台 |
例子
/*通过 CComBSTR(_In_opt_z_ LPCSTR pSrc) 构造函数
申请空间SysAllocStringLen
字符转码MultiByteToWideChar 放到动态空间m_str成员
改进方法:直接使用Unicode赋值,因此对于TCHAR WCHAR _T TEXT L 这些辅助的字符处理函数和宏要熟悉
text = L"demo"; */ CComBSTR text = "demo"; 以下是从一个实际的软件代码中节选的错误使用情况
#include <string> using namespace std ; void Demo(BSTR bstrlibName) { _bstr_t bstr_name(bstrlibName); string strName; strName = bstr_name; strName = strName.substr(1); //¡. CString next(strName.c_str()); //Process¡ //¡ }
分析
以上代码是不同人维护引入的,估计是由于不同人员熟悉和使用的库不一样,比如甲熟悉stl, 乙熟悉MFC,…,不过这样的代码汇在一起,
如果在要求效率的地方,那么以上的代码存在很大的效率隐患。
只要在VS中定位到STL MFC等这些类的代码,就可以知道,这样的对象在使用过程中进行n多的空间申请和赋值等。
可能的改进方法
Ø 如以上传入是BSTR,因此一般情况下最好直接使用这个类型处理,不要引入不必要的对象转换
Ø 也有可能某人想使用已有的对象提供的函数减少不必要的编码,此时最好只引入一个类,或则STL,或则CString等
(此时选择的类最好是和BSTR配套的如wstring,以减少转换问题)
Ø 为了在项目中更通用,其实也可以包装一个针对项目特殊处理的类以减少转换和减少空间申请问题