代码改变世界

第二章 字符和字符串处理

2017-07-30 22:35  szn好色仙人  阅读(393)  评论(0编辑  收藏  举报
/*
1.编码格式
UTF-16:	将每个字符编码为2-4个字节
UTF-8:	将一些字节编码为1-4个字节,将0x0080以下的字符压缩为1字节,0x0080和0x07FF之间的字符转换为2个字节,0x0800以上的字符转换为3字节,最后,代理对被写为4字节
UTF-32:	将每个字符编码为4个字节


2.宽字符与宽字符串
wchar_t aValue[2] = {'a', 'b'};		//61 00 62 00
wchar_t* pWStr = L"Abc";			//41 00 62 00 63 00 00 00

TCHAR* pStr = TEXT("123");			//31 00 32 00 33 00 00 00	Unicode环境下
									//31 32 33 00				多字节环境下
									//在Unicode环境下,string无法直接由TCHAR*进行构造
									//在Unicode环境下,wstring可以由TCHAR*进行构造


3.使用TCHAR, TEXT替换项目中的非数据流的char和wchar,其能很好的搭配string,wstring		
#include <windows.h>
#ifdef UNICODE
typedef wstring m_string;
#else 
typedef string m_string;
#endif

m_string str = TEXT("SZN");			//不管是否是Unicode项目,此代码都可以通过编译	
									//使用上述方法,在MFC下,使用CString时候,也能很方便的进行和m_string的转换

#define _T(x)       __T(x)
#define _TEXT(x)    __T(x)


4.C运行库提供的字符串处理函数,常规的是str带头的,对于宽字节字符串,是以wcs替换str即可
wchar_t* wStr = L"123";
int nSize0 = wcslen(wStr);			//nSize0 = 3


5.使用_t开头的_s结尾的通用字符串安全处理函数
#include <tchar.h>
TCHAR* wStr = TEXT("123");
int nSize0 = _tcslen(wStr);			//nSize0 = 3	这个值不随是否是UNICODE环境所改变

tchar.h头文件中的一些定义				取决于是否定义了UNICODE
#define _tcscat		strcat
#define _tcscat_s	strcat_s
#define _tcscpy		strcpy
#define _tcscpy_s	strcpy_s
#define _tcslen		strlen
#define _tcsnlen	strnlen

#define _tcscat			wcscat
#define _tcscat_s		wcscat_s
#define _tcschr			wcschr
#define _tcscpy			wcscpy
#define _tcscpy_s		wcscpy_s
#define _tcscspn		wcscspn
#define _tcslen			wcslen
#define _tcsnlen		wcsnlen
#define _tcsncat		wcsncat
#define _tcsncat_s		wcsncat_s
#define _tcsncat_l		_wcsncat_l
#define _tcsncat_s_l	_wcsncat_s_l
#define _tcsncpy		wcsncpy
#define _tcsncpy_s		wcsncpy_s
#define _tcsncpy_l		_wcsncpy_l
#define _tcsncpy_s_l	_wcsncpy_s_l
#define _tcspbrk		wcspbrk
#define _tcsrchr		wcsrchr
#define _tcsspn			wcsspn
#define _tcsstr			wcsstr
#define _tcstok			wcstok
#define _tcstok_s		wcstok_s
#define _tcstok_l		_wcstok_l
#define _tcstok_s_l		_wcstok_s_l


6.多字节字符串转换为宽字节字符串
// #define CP_ACP                    0           // default to ANSI code page
// #define CP_OEMCP                  1           // default to OEM  code page
// #define CP_MACCP                  2           // default to MAC  code page
// #define CP_THREAD_ACP             3           // current thread's ANSI code page
// #define CP_SYMBOL                 42          // SYMBOL translations
// 
// #define CP_UTF7                   65000       // UTF-7 translation
// #define CP_UTF8                   65001       // UTF-8 translation

const WCHAR* pWStrC = L"123456";
char buff[1024] = {};
WideCharToMultiByte(CP_ACP, 0, pWStrC, wcslen(pWStrC), buff, 1024, nullptr, nullptr);	//buff = 0x003dfa20 "123456"

const char* pStrC = "123456";
WCHAR wBuff[1024] = {};
MultiByteToWideChar(CP_ACP, 0, pStrC, strlen(pStrC), wBuff, 1024);						//wBuff = 0x0040f0bc "123456"
*/