C语言宽字符

本文介绍了C语言中处理宽字符的方法,包括宽字符的表示、宽字符与多字节字符的区别,以及如何在控制台正确显示宽字符。同时,讨论了MFC下的字符串转换宏和注意事项,如USES_CONVERSION的使用限制。

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

一. 多字节字符

1. 基于ASCII的GB2312

标准ASCII表 0 ~ 127

拓展ASCII表 0 ~ 255

GB2312 10000000 ~ 11111111(高位) + 10000000 ~ 11111111(低位)

    问题:不同国家的字符集会产生乱码

2. 基于UNICODE的UTF-8

UNICODE(同一码 / 万国码):unicode是2个字节。 这一标准的2字节形式通常称作UCS-2(UnicodeCharacterSet)(原ASCII也位双字节)。然而,受制于2字节数量的限制,UCS-2只能表示最多65536个字符。Unicode的4字节形式被称为UCS-4或UTF-32,能够定义Unicode的全部扩展,最多可定义100万个以上唯一字符。

UTF-8:是针对Unicode的一种可变长度字符编码。

 

二. C语言中的宽字符

1. 在C语言中使用wchar_t表示宽字符,使用L告知编译器使用Unicode表。wchar_t x1 = L'中';

2. 使用(拓展ASCII码表)GB2312以\0结尾:char x[] = "中国"; 使用UniCode编码表以\0\0结尾:wchar_t x1[] = L"中国";         
3. 在控制台打印                    
                    

char x[] = "中国";                    

wchar_t x1[] = L"中国";                    

printf("%s\n",x);            //使用控制台默认的编码        

wprintf(L"%s\n",x1);            //默认使用英文    

在打印x1时默认使用ASCII码表解码所以会出现乱码或无法显示。

此时需要告诉编译器,使用控制台默认的编码格式                    

(1) 包含头文件 #include <locale.h>                    

(2) setlocale(LC_ALL,""); //使用控制台默认的编码                    

 

三. C语言宽字符操作函数

在使用函数时也是有区别的。

	char x[] = "中国";
	wchar_t x1[] = L"中国";
	cout << strlen(x) << endl; // 4
	cout << wcslen(x1) << endl; // 2
	char		wchar_t		//多字节字符类型   宽字符类型			
								
	printf		wprintf		//打印到控制台函数			
								
	strlen		wcslen		//获取长度			
								
	strcpy		wcscpy		//字符串复制			
								
	strcat		wcscat		//字符串拼接			
								
	strcmp		wcscmp		//字符串比较			
								
	strstr		wcsstr		//字符串查找			

 

四. 字符串转换

1. MFC下的常用字符串数据类型表示的含义:

L:Long  长  P:Point  指针  C:Const  常量  W:Wchar_t  宽字符  T:TCHAR   STR:String  字符串

2. MFC下提供的ATL 转换宏:

T2A  T2W  T2CA T2CW         W2A  W2CA W2T  W2CT         A2W  A2CW A2T  A2CT 

T:TCHAR  2:To  C:CONST  A:CHAR(ANSI)  W:WCHAR

3. 先到atlconv.h头文件下看看这些宏的定义,还需要在转换上方添加宏,并以分号结束:USES_CONVERSION;它定义了转换宏所需的一些局部变量。

4. 使用USES_CONVERSION一定要小心,它们从堆栈上分配内存,直到调用它的函数返回,该内存不会被释放。如果在一个循环中,这个宏被反复调用几万次,将不可避免的产生stackoverflow。

5. 但是考虑到栈空间的尺寸( 默认2M),使用时要注意几点:
    1、只适合于进行短字符串的转换;
    2、不要试图在一个次数比较多的循环体内进行转换;
    3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
    4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

https://www.cnblogs.com/wind-net/archive/2012/10/31/2746995.html

 

五. 打印信息的方式

	int a = 10;
	TRACE("a == %d", a);
	CString s;
	s.Format(CString("a == %d"), 20);
	AfxMessageBox(s);
	MessageBox(TEXT("111", NULL, NULL, NULL));
#define log(fmt, ...) \
CString str; \
str.Format(CString(fmt), __VA_ARGS__); \
AfxMessageBox(s);

void CPVZCheartDlg::OnBnClickedButton1()
{
	int a = 10;
	log("a == %d", a);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值