1、定义
ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符。超出此范围的使用0x80~0xFFFF来编码,即扩展的ASCII编码。
UNICODE是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的,以满足跨语言、跨平台进行文本转换、处理的要求。
8bit的ANSI编码只能表示256种字符,表示26个英文字母是绰绰有余的,但是表示汉字,韩国语等有着成千上万个字符的非西方字符肯定就不够了,正是如此才引入了UNICODE标准。
2、函数使用
ANSI
char *strcat(char *, const char *)
char *strchr(const char * , int)
int strcmp(const char *, const char *)
char *strcpy(char *, const char *)
size_t strlen(const char *)
Unicode
wchar_t *wcscat(wchar_t *, const wchar_t *)
wchar_t *wcschr(const wchar_t * , int)
int wcscmp(const wchar_t *, const wchar_t *)
wchar_t *wcscpy(wchar_t *, const wchar_t *)
wchar_t wcslen(const wchar_t *)
L" wash " : 用于将ANSI字符串转换为Unicode字符串;
_TEXT(" wash ")根据是否定义Unicode或_Unicode进行转换。
#ifdef _UNICODE
#define _T("ABC") L"ABC"
#else //没有定义_UNICODE
#define _T("ABC") "ABC"
#endif
_T("ABC")中的一个字符和汉字一样,占两个字节,而在"ABC"中,英文字符占一个字节,汉字占两个字节。
3、数据类型
Both(ANSI/Unicode) | ANSI | Unicode |
LPCTSTR | LPCSTR | LPCWSTR |
LPTSTR | LPSTR | LPWSTR |
PCTSTR | PCSTR | PCWSTR |
PTSTR | PSTR | PWSTR |
TBYTE(TCHAR) | CHAR | WCHAR |
4、类型转换
4.1 将字符串转换为双精度型
double atof(
const char *str
);
double _atof_l(
const char *str,
_locale_t locale
);
double _wtof(
const wchar_t *str
);
double _wtof_l(
const wchar_t *str,
_locale_t locale
);
4.2 将字符串转换为整数
int atoi(
const char *str
);
int _wtoi(
const wchar_t *str
);
int _atoi_l(
const char *str,
_locale_t locale
);
int _wtoi_l(
const wchar_t *str,
_locale_t locale
);
将字符串转换为 64 位整数
__int64 _atoi64(
const char *str
);
__int64 _wtoi64(
const wchar_t *str
);
__int64 _atoi64_l(
const char *str,
_locale_t locale
);
__int64 _wtoi64_l(
const wchar_t *str,
_locale_t locale
);
4.3 将字符串转换为长整型
long atol(
const char *str
);
long _atol_l(
const char *str,
_locale_t locale
);
long _wtol(
const wchar_t *str
);
long _wtol_l(
const wchar_t *str,
_locale_t locale
);
将字符串转换成 long long 整数
long long atoll(
const char *str
);
long long _wtoll(
const wchar_t *str
);
long long _atoll_l(
const char *str,
_locale_t locale
);
long long _wtoll_l(
const wchar_t *str,
_locale_t locale
);
4.4 将整数转换为字符串
char * _itoa( int value, char *buffer, int radix );
char * _ltoa( long value, char *buffer, int radix );
char * _ultoa( unsigned long value, char *buffer, int radix );
char * _i64toa( long long value, char *buffer, int radix );
char * _ui64toa( unsigned long long value, char *buffer, int radix );
wchar_t * _itow( int value, wchar_t *buffer, int radix );
wchar_t * _ltow( long value, wchar_t *buffer, int radix );
wchar_t * _ultow( unsigned long value, wchar_t *buffer, int radix );
wchar_t * _i64tow( long long value, wchar_t *buffer, int radix );
wchar_t * _ui64tow( unsigned long long value, wchar_t *buffer, int radix );
// These POSIX versions of the functions have deprecated names:
char * itoa( int value, char *buffer, int radix );
char * ltoa( long value, char *buffer, int radix );
char * ultoa( unsigned long value, char *buffer, int radix );
// The following template functions are C++ only:
template <size_t size>
char *_itoa( int value, char (&buffer)[size], int radix );
template <size_t size>
char *_itoa( long value, char (&buffer)[size], int radix );
template <size_t size>
char *_itoa( unsigned long value, char (&buffer)[size], int radix );
template <size_t size>
char *_i64toa( long long value, char (&buffer)[size], int radix );
template <size_t size>
char * _ui64toa( unsigned long long value, char (&buffer)[size], int radix );
template <size_t size>
wchar_t * _itow( int value, wchar_t (&buffer)[size], int radix );
template <size_t size>
wchar_t * _ltow( long value, wchar_t (&buffer)[size], int radix );
template <size_t size>
wchar_t * _ultow( unsigned long value, wchar_t (&buffer)[size], int radix );
template <size_t size>
wchar_t * _i64tow( long long value, wchar_t (&buffer)[size], int radix );
template <size_t size>
wchar_t * _ui64tow( unsigned long long value, wchar_t (&buffer)[size],
int radix );
将整数转换为字符串
errno_t _itoa_s( int value, char * buffer, size_t size, int radix );
errno_t _ltoa_s( long value, char * buffer, size_t size, int radix );
errno_t _ultoa_s( unsigned long value, char * buffer, size_t size, int radix );
errno_t _i64toa_s( long long value, char *buffer,
size_t size, int radix );
errno_t _ui64toa_s( unsigned long long value, char *buffer,
size_t size, int radix );
errno_t _itow_s( int value, wchar_t *buffer,
size_t size, int radix );
errno_t _ltow_s( long value, wchar_t *buffer,
size_t size, int radix );
errno_t _ultow_s( unsigned long value, wchar_t *buffer,
size_t size, int radix );
errno_t _i64tow_s( long long value, wchar_t *buffer,
size_t size, int radix );
errno_t _ui64tow_s( unsigned long long value, wchar_t *buffer,
size_t size, int radix
);
// These template functions are C++ only:
template <size_t size>
errno_t _itoa_s( int value, char (&buffer)[size], int radix );
template <size_t size>
errno_t _ltoa_s( long value, char (&buffer)[size], int radix );
template <size_t size>
errno_t _ultoa_s( unsigned long value, char (&buffer)[size], int radix );
template <size_t size>
errno_t _itow_s( int value, wchar_t (&buffer)[size], int radix );
template <size_t size>
errno_t _ltow_s( long value, wchar_t (&buffer)[size], int radix );
template <size_t size>
errno_t _ultow_s( unsigned long value, wchar_t (&buffer)[size], int radix );
4.5 char*、string与CString相互转换
CString -> string
CString str1 = _T("abc");
std::string str2 = CT2A(str1);
string s(CString.GetBuffer());
//GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
------------------------------------------------------------------------
string -> CString
string str1=L"abc";
CString str2 = CA2T(str1.c_str());
CString.format("%s", string.c_str());
------------------------------------------------------------------------
string -> char*
string str="abc";
char *p=str.data();//返回没有”\0“的字符串数组
string str="gdfd";
char *p=str.c_str();//返回有”\0“的字符串数组
------------------------------------------------------------------------
CString -> char*
CString str = "ABC";
char* pBuf = str.GetBuffer(0);
str.ReleaseBuffer();
------------------------------------------------------------------------
char* -> string
string s(char *);//借用string类的构造函数
------------------------------------------------------------------------
char* -> CString
CString.format("%s", char*);
CString->TCHAR*的转化可以用函数GetBuff()
------------------------------------------------------------------------
CString -> TCHAR* 转换
函数原型为:LPTSTR GetBuffer( int nMinBufLength );
CString str("CString");
TCHAR* szMsg = new TCHAR[100];
//其参数为CString字符串的长度
szMsg = str.GetBuffer(str.GetLength());
str.ReleaseBuffer();
delete []szMsg;
szMsg = NULL;
------------------------------------------------------------------------
TCHAR* -> CString的转化
TCHAR szTchar[18] = L"TCHAR";
CString str;
str.Format(_T("%s"),szTchar);