C语言宽字符 wchar_t 类型


过去C语言并不适合非英语国家(地区)使用。C语言最初假定字符都是单字节的。但是这些假定并不是在世界的任何地方都适用。

C语言字符默认是采用ASCII编码的,ASCII字符集采用的是单字节编码,且只使用了单字节中的低7位,最高位是没有使用的,可表用为0xxxxxxxx;可以看到,ASCII字符集共包含128个字符,在英语国家中,128个字符是基本够用的,但是,在其他国家语言中,比如,在法语中,字母上方有注音符号,它就无法用 ASCII 码表示。

于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不⼀样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0–127表示的符号是一样的,不一样的只是128–255的这一段。

至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是 GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示 256 x 256 = 65536 个符号。

后来为了使C语言适应国际化,C语言的标准中不断加入了国际化的支持。比如:加入了宽字符的类型wchar_t 和宽字符的输入和输出函数,加入了<locale.h>头文件,其中提供了允许程序员针对特定地区(通常是国家或者说某种特定语言的地理区域)调整程序行为的函数。

<locale.h>本地化

<locale.h>提供的函数用于控制C标准库中对于不同的地区会产生不⼀样行为的部分。
在标准中,依赖地区的部分有以下几项:
• 数字量的格式
• 货币量的格式
• 字符集
• 日期和时间的表示形式

类项

通过修改地区,程序可以改变它的行为来适应世界的不同区域。但地区的改变可能会影响库的许多部分,其中⼀部分可能是我们不希望修改的。所以C语言支持针对不同的类项进行修改,下面的一个宏,指定⼀个类项:

• LC_COLLATE:影响字符串比较函数 strcoll() 和 strxfrm() 。
• LC_CTYPE:影响字符处理函数的行为。
• LC_MONETARY:影响货币格式。
• LC_NUMERIC:影响 printf() 的数字格式。
• LC_TIME:影响时间格式 strftime() 和 wcsftime() 。
• LC_ALL - 针对所有类项修改,将以上所有类别设置为给定的语言环境。
参考Windows的详细说明

setlocale函数

 char* setlocale (int category, const char* locale);

setlocale 函数用于修改当前地区,可以针对一个类项修改,也可以针对所有类项。
setlocale 的第一个参数可以是前面说明的类项中的一个,那么每次只会影响一个类项,如果第一个参数是LC_ALL,就会影响所有的类项。

C标准给第二个参数仅定义了2种可能取值:“C”(正常模式)和 “”(本地模式)。
在任意程序执行开始,都会隐藏式执行调用:

setlocale(LC_ALL, "C");

当地区设置为"C"时,库函数按正常方式执行,小数点是一个点。
当程序运行起来后想改变地区,就只能显示调用setlocale函数。用 “” 作为第2个参数,调用setlocale函数就可以切换到本地模式,这种模式下程序会适应本地环境。
比如:切换到我们的本地模式后就支持宽字符(汉字)的输出等。

 setlocale(LC_ALL, "");//切换到本地环境

宽字符的打印

那如果想在屏幕上打印宽字符,怎么打印呢?
宽字符的字面量必须加上前缀“L”,否则 C 语言会把字面量当作窄字符类型处理。前缀 “L” 在单引号前面,表示宽字符,对应 wprintf() 的占位符为 %lc ;在双引号前面,表示宽字符串,对应wprintf() 的占位符为 %ls
在这里插入图片描述

#include <stdio.h>
#include<locale.h>

int main() 
{
	setlocale(LC_ALL, "");
	wchar_t ch1 = L'●';
	wchar_t ch2 = L'■';
	wchar_t ch3 = L'★';
	wchar_t ch4 = L'我';

	printf("%c%c\n", 'a', 'b');

	wprintf(L"%lc\n", ch1);
	wprintf(L"%lc\n", ch2);
	wprintf(L"%lc\n", ch3);
	wprintf(L"%lc\n", ch4);
	return 0;
}

提醒

以上代码环境为 VS2022C语言,要注意的是,Win11 默认控制台使用的是 Windows 终端,应该改为 Windows 控制台主机,才可正常使用宽字符。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 25
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
算法,对风险进行预测和控制,从而实现风险管理和风险控制。常见的在 C 语言中,需要使用标准库函数进行转换。可以使用以下函数之一来进行转换: 1. mbstowcs:该函数可以将多字节字符转换为字符。 2. wcstombs:该函数可以风险控制应用包括信用评估、欺诈检测和投资风险控制等。 四、机将字符转换为多字节字符。 例如,可以使用以下代码将 char* 转换为 wchar_t*: ```c #include <stdlib.h> #include <string.h> #include <wchar.h> wchar_t* widen(const char* str) { size_t len = strlen(str) + 1; wchar_t* wide_str = (wchar_t*)malloc(len * sizeof(wchar_t)); 器学习最新进展 机器学习技术在近年来得到了快速发展,不断涌 mbstowcs(wide_str, str, len); return wide_str; } ``` 然后,可以使用以下代码将 wchar现出一些新的算法和应用。以下是机器学习的一些最新进展: 1. 深_t* 转换为 char*: ```c #include <stdlib.h> #include <string.h> #include <wchar.h> char* narrow(const wchar_t* str) { size_t len = wcslen(str) + 1; char* narrow_str = (char*)度学习 深度学习是指通过多层神经网络进行学习和分析的一种机器学习malloc(len); wcstombs(narrow_str, str, len); return narrow_str; } ``` 示例代码如下: 方法。相比传统的机器学习算法,深度学习可以自动提取数据中的特征信息```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <wchar.h> // 将 char* 转换为 wchar_t* wchar_t* widen(const char* str) { size_t len = strlen(str) + 1; wchar_t,从而提高模型的准确性和泛化能力。 2. 异常检测 异常检测是指* wide_str = (wchar_t*)malloc(len * sizeof(wchar_t)); mbstowcs(wide_str, str, len); 通过机器学习算法,对数据中的异常和离群点进行识别和分析的一种方法。近 return wide_str; } // 将 wchar_t* 转换为 char* char* narrow(const wchar_t* str) { size_t len = wcslen(str) + 1; char* narrow_str = (char*)malloc(len); wcstombs(narrow_str年来,异常检测在金融、医疗和工业等领域得到了广泛应用。 3. 迁, str, len); return narrow_str; } int main() { char* str = "Hello, world!"; wchar_t* wide_str = widen(str); wprintf(L"wide_str: %ls\n", wide_str); char* narrow_str = narrow(w移学习 迁移学习是指通过在不同领域的数据上进行学习和分析,从而提ide_str); printf("narrow_str: %s\n", narrow_str); free(wide_str); free(narrow_str); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值