wchar_t c=L'A';//a 16bit character
wchar_t szBuffer[100]= L"A String";//99个16位的字符和一个16位的结束0
#ifdef _UNICODE
typedefwchar_t TCHAR;// 定义了_UNICODE宏的情况下,TCHAR是两个字节的字符
#define __T(x) L##x
// ##是ANSI C标准的预处理语法,它叫做“粘贴运算符”,即将前面的L与宏参数合在一起。
#define _T(x) __T(x)// _T(x)一个下划线的变成__T(x)两个下划线的
#else
#define __T(x) x // 未定义_UNICODE宏的情况下,TCHAR是一个字节的字符
typedefchar TCHAR;// 非宽字符的字符串常量
#endif
#ifdef UNICODE
typedef WCHAR TCHAR,*PTCHAR ,*PTSTR;
typedef CONST WCHAR *PCTSTR;
#define __TEXT(quote) L##quote
#else
typedef CHAR TCHAR ,*PTCHAR,PTSTR;
typedef CONST CHAR *PTCHAR;
#define __TEXT(quote) quote
#endif
#define TEXT(quote) __TEXT(quote)
PTSTR _tcscpy(PTSTR strDestination,PCTSTR strSource);
erron_t _tcscpy_s(PTSTR strDestination,size_tnumberOfCharacters,PCTSTR strSource);
#include<stdlib.h>//包含_countof宏获取字符数
#include<cstdio>
#include<StrSafe.h>
usingnamespace std;
int main()
{
wchar_t buffer[5]= L"1234";
wcscpy_s(buffer,_countof(buffer), L"12345");
return0;
}
在Microsoft的StrSafe.h文件中定义新的安全字符串函数,除了新的安全字符串函数,还新增了一些函数,用于在执行字符串处理时提供更多的控制。可以控制填充符,或者指定如何进行截断
下面为部分原型:常用的
HRESULT StringCchCat( PTSTR pszDest,size_t cchDest, PCTSTR pszSrc);
HRESULT StringCchCatEx( PTSTR pszDest,size_t cchDest, PCTSTR pszSrc,
PTSTR*ppszDestEnd,size_t*pcchRemaining, DWORD dwFlags );
还有StringCchCpy
StringCchCpyEx
StringCchPrintf
StringCchPrintfEx等
可以看出含有“Cch”,这表示count of characters即字符数,通常用_countof宏来获取。
还有含有“Cb”,如StringCbCat(Ex),StringCbCopy(Ex),StringCbPrintf(Ex)这些函数指定的是字节数,
通常使用sizeof操作符来获取此值
这些函数都返回HRESULT不同于安全函数(带_S后缀的),当缓冲区太小的时候,这些函数会执行截断
CompareStringOrdinal(注:只支持unicode)
6.推荐的字符和字符串处理方式
1、开始讲文本字符串想象为字符数组,而不是char会字节的数组!
2、用通用的数据类型(如TCHAR、PTSTR、LPTSTR)来表示文本字符和字符串!
3、用明确的数据类型(如BYTE和PBYTE)来表示字节和字节指针和数据缓冲区!
4、用TEXT或_T宏表示字面字符和字符串,但是为了保持一致性,避免两者混用,虽然两者是一样的!
5、执行全集替换(例如用PTSTR替换为PSTR)
6、注意在字符串有关计算的地方。如:某函数形参为缓冲区字符数
7、避免使用printf系列函数,尤其不要用%s和%S字段类型来进行ANSI和unicode字符串之间的相互转换。应该用 MultiByteToWideChar和WideCharToMultiByte进行函数。
8、UNICODE 和_UNICODE符号要么同时制定要么都不要指定要使用新的安全函数 和 新增的字符串函数(更多控制力的) 和 windows的字符串处理函数
10、利用RTC编译器标志来自动检测缓冲区溢出
11、对于字符串的比较
intMultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte, //为-1时自动判断大小
LPWSTR lpWideCharStr,
int cchWideChar //为0时,该函数返回目标缓存区需要的大小
);
intWideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPWSTR lpWideCharStr,
int cchWideChar, //为-1时自动判断大小
LPCSTR lpMultiByteStr,
int cchMultiByte, //为0时,该函数返回目标缓存区需要的大小
LPCSTR lpDefaultChar, //遇到一个不能转换的宽字符,函数便会使用pDefaultChar参数指向的字符
PBOOL pfUsedDefaultChar //至少有一个字符不能转换为其多字节形式,函数就会把这个变量设为TRUE)
);
1. ANSI to Unicode
wstring ANSIToUnicode(const string& str )
{
int len =0;
len = str.length();
int unicodeLen =::MultiByteToWideChar( CP_ACP,
0,
str.c_str(),
-1,
NULL,
0);
wchar_t* pUnicode;
pUnicode =newwchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_ACP,
0,
str.c_str(),
-1,
(LPWSTR)pUnicode,
unicodeLen );
wstring rt;
rt =(wchar_t*)pUnicode;
delete pUnicode;
return rt;
}
2.Unicode to ANSI
string UnicodeToANSI(const wstring& str )
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen =WideCharToMultiByte( CP_ACP,
0,
str.c_str(),
-1,
NULL,
0,
NULL,
NULL );
pElementText =newchar[iTextLen +1];
memset((void*)pElementText,0,sizeof(char)*( iTextLen +1));
::WideCharToMultiByte( CP_ACP,
0,
str.c_str(),
-1,
pElementText,
iTextLen,
NULL,
NULL );
string strText;
strText = pElementText;
delete[] pElementText;
return strText;
}
3. UTF-8 to Unicode
wstring UTF8ToUnicode(const string& str )
{
int len =0;
len = str.length();
int unicodeLen =::MultiByteToWideChar( CP_UTF8,
0,
str.c_str(),
-1,
NULL,
0);
wchar_t* pUnicode;
pUnicode =newwchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_UTF8,
0,
str.c_str(),
-1,
(LPWSTR)pUnicode,
unicodeLen );
wstring rt;
rt =(wchar_t*)pUnicode;
delete pUnicode;
return rt;
}
4.Unicode to UTF-8
string UnicodeToUTF8(const wstring& str )
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen =WideCharToMultiByte( CP_UTF8,
0,
str.c_str(),
-1,
NULL,
0,
NULL,
NULL );
pElementText =newchar[iTextLen +1];
memset((void*)pElementText,0,sizeof(char)*( iTextLen +1));
::WideCharToMultiByte( CP_UTF8,
0,
str.c_str(),
-1,
pElementText,
iTextLen,
NULL,
NULL );
string strText;
strText = pElementText;
delete[] pElementText;
return strText;
}
IsTextUnicode编辑
本词条缺少信息栏、名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
IsTextUnicode函数
确定一个缓冲区是否可能包含Unicode文本。
语法
BOOL IsTextUnicode(
__in const VOID *lpv,
__in int iSize,
__inout LPINT lpiResult
);
参数
lpv
指向要检查的输入缓冲区。
iSize
由lpv指向的缓冲区大小,以字节为单位。
lpiResult
可选
返回值
如果缓冲区的数据通过了指定测试,返回非零值。如果缓冲区的数据没有通过指定测试该函数返回0。