MFC常用类型转换,以及UNICODE与ANSI

本文详细介绍了ANSI和Unicode字符编码的区别,包括各自的定义、适用范围及如何在编程中使用相关函数。此外还介绍了不同数据类型及其转换方法,对于从事多语言支持软件开发的技术人员非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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  LPCSTRLPCWSTR
LPTSTRLPSTRLPWSTR
PCTSTR   PCSTRPCWSTR
PTSTRPSTRPWSTR
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);  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值