Ansi与Unicode编码
窄字节与宽字节
视频教程: Ansi与Unicode编码
VC++6.0默认Ansi编码,VS2005以后默认Unicode编码
Ansi=窄字节 Unicode=宽字节
Ansi用char格式表示一个字符,占用一个字节的存储空间,最多表示255个字符
Unicode用两个字节表示一个字符,格式是unsigned short,被定义成wchar_t格式
大家在编程时经常遇到的数据类型:
● Ansi:
char 代表一个字符 (CHAR)
char * 代表一个字符串指针 (PCHAR PSTR LPSTR)
const char * 代表常量字符串的指针 (LPCSTR)
● Unicode:
wchar_t WCHAR
wchar_t * PWCHAR、PWSTR、LPWSTR
赋值时注意:str=L”liming” 加上L
const wchar_t * LPCWSTR
● T 通用类型:
TCHAR、(TCHAR * 、PTCHAR、PTSTR、LPTSTR)、LPCTSTR
赋值时注意:str=_T(”liming”) 加上_T( )或_TEXT()
注意:P是指针的意思 STR是字符串的意思 L是长指针的意思(在WIN32下可以忽略)
C是 const常量的意思 W代表宽字节的意思
T通用类型的意思(优点:修改工程编码之后不用修改代码)
字符串类型的对象的定义:
● Ansi:char *pAnsiStr = "hello";
● Unicode:wchar_t *pUnicodeStr = L"hello";
● 通用类型:TCHAR *pTStr = _T("hello"); 或者 TCHAR *pTStr = _TEXT("hello");
● 动态申请内存:TCHAR *pszBuf = new TCHAR[100];
窄字节(Ansi)与宽字节(Unicode)的转换
Unicode转ANSI(或UTF8)
wchar_t* pwszUnicode = L"Holle李明"; char* pszMultiByte=NULL; //因为事先不知道窄字节空间大小,所以指定为NULL int iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL);//宽字节转换成其它字节 //参数1:CP_ACP 转换成Ansi // CP_UTF8 转换为UTF8 //参数2:指定如何处理没有转换的字符,但不设此参数函数会运行的更快一些,一般都是把它设为0 //参数3:待转换的宽字符串 //参数4:待转换宽字符串的长度,-1表示转换到字符串结尾 //参数5:接收转换后输出新串的缓冲区 //参数6:输出缓冲区大小;如果为0,参数5将被忽略(设为NULL),函数将返回所需缓冲区大小而不使用参数5 //参数7:指向字符的指针, 在指定编码里找不到相应字符时使用此字符作为默认字符代替。如果为NULL则使用系统默认字符 //参数8:开关变量的指针,用以表明是否使用过默认字符。对于要求此参数为NULL的参数2(dwFlags)而使用此参数 // 参数7和参数8都设为NULL,函数会更快一些 //转换后所占用的空间 //上面函数说明:由于参数6为0,所以参数5位NULL; 返回值为10 ----这一步的目的是求窄字节的空间 pszMultiByte = new char[iSize]; //给窄字节申请空间 ZeroMemory(pszMultiByte, iSize); //内存清零 //用0来填充一块内存区域 //参数1:指向一块准备用0来填充的内存区域的开始地址 //参数2:准备用0来填充的内存区域的大小,按字节来计算 WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL); //进行转换
ANSI(或UTF8)转Unicode
char* pszMultiByte = "Holle李明"; wchar_t* pwszUnicode = NULL;//因为事先不知道宽字节空间大小,所以指定为NULL int n= MultiByteToWideChar(CP_ACP,NULL, pszMultiByte,-1,NULL,0); //参数1:CP_UTF8:转换为UTF-8 // CP_ACP:ANSI字符集 //参数2:一组位标记用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符 // 一般为 NULL //参数3:待转换的窄字符串 //参数4:待转换窄字符串的长度,-1表示转换到字符串结尾 //参数5:接收转换后输出新串的缓冲区 //参数6:输出缓冲区大小,如果为0,参数5将被忽略(设为NULL),函数将返回所需缓冲区大小而不使用参数5 //返回值=8 这一步的目的是求宽字节的占用空间 pwszUnicode = new wchar_t[n]; //给宽字节申请空间 ZeroMemory(pwszUnicode, n); //内存清零 MultiByteToWideChar(CP_ACP, NULL, pszMultiByte, -1, pwszUnicode, n); //转换
使用宏转换
wchar_t* pwszUnicode = L"Holle李明"; USES_CONVERSION; //一定加上,否则编译出错 char* pszMultiByte = W2A(pwszUnicode);//宽字节转换成窄字节 //A2W 窄字节 转换成宽字节 //T2A 通用转换成窄字节 //T2W 通用转换成宽字节
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)