c++字符处理引出的问题

简介: 字符编码的问题 C/C++发展的过程很长,早期的字符都是Multibyte的形式,后期为了处理多国语言增加了Unicode,因此比JAVA和C#这些后来者内置的字符是Unicode的支持,在处理时需要注意。

字符编码的问题

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")};
        TCHAR *s1 = _T("tchar with compile option");
        TCHAR *s2 = _TEXT("tchar");

Unicode

       wchar_t *wmsg = L"Is";
        WCHAR *uc = L"Is uc";

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,以减少转换问题)
Ø  为了在项目中更通用,其实也可以包装一个针对项目特殊处理的类以减少转换和减少空间申请问题
相关文章
|
25天前
|
存储 算法 编译器
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
47 1
|
1月前
|
对象存储 C++
在C++语言中字符串流
在C++语言中字符串流
17 2
|
1月前
|
存储 C++ 索引
C++ string容器-字符存取讲解
C++ string容器-字符存取讲解
26 0
|
1月前
|
编译器 C++
c++关键字与三字符组
c++关键字与三字符组
18 0
|
1月前
|
存储 C++
c++字符和不常见常量
c++字符和不常见常量
25 0
|
6月前
|
C语言 C++
C/C++字符函数和字符串函数模拟实现与详解————长度不受限制的字符串函数
C/C++字符函数和字符串函数模拟实现与详解————长度不受限制的字符串函数
25 0
|
3月前
|
C++
c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)
c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)
54 0
存储 编译器 Linux
18 0
|
7月前
|
C++
C++读取单个字符操作
get() 是 istream 类的成员函数,它有多种重载形式,不过本文只介绍最简单最常用的一种: int get(); 此函数从输入流中读入一个字符,返回值就是该字符的 ASCII 码。 如果碰到输入的末尾,则返回值为 EOF。EOF 是 End of File 的缩写。istream 类中从输入流(包括文件)中读取数据的成员函数,在把输入数据都读取完后再进行读取,就会返回 EOF。 EOF 是在 iostream 类中定义的一个整型常量,值为 -1。get() 函数不会跳过空格、制表符、回车等特殊字符,所有的字符都能被读入。例如下面的程序: #include <iostr
55 0
|
3月前
|
Go 机器学习/深度学习 Rust
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
33 0
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String