C语言 ——宽字符

前言:

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

C语⾔字符默认是采⽤ASCII编码的,ASCII字符集采⽤的是单字节编码,且只使⽤了单字节中的低7 位,最⾼位是没有使⽤的,可表⽰为0xxxxxxxx;可以看到,ASCII字符集共包含128个字符,在英语 国家中,128个字符是基本够⽤的,但是,在其他国家语⾔中,⽐如,在法语中,字⺟上⽅有注⾳符 号,它就⽆法⽤ ASCII 码表⽰。

于是,⼀些欧洲国家就决定,利⽤字节中闲置的最⾼位编⼊新的符 号。⽐如,法语中的é的编码为130(⼆进制10000010)。这样⼀来,这些欧洲国家使⽤的编码体 系,可以表⽰最多256个符号。但是,这⾥⼜出现了新的问题。不同的国家有不同的字⺟,因此,哪 怕它们都使⽤256个符号的编码⽅式,代表的字⺟却不⼀样。

比如,亚洲国家的⽂字,使⽤的符号就更多了,汉字就多达10万左右。⼀个字节只能表⽰256种符号, 肯定是不够的,就必须使⽤多个字节表达⼀个符号。⽐如,简体中⽂常⻅的编码⽅式是 GB2312,使 ⽤两个字节表⽰⼀个汉字,所以理论上最多可以表⽰ 256 x 256 = 65536 个符号。 后来为了使C语⾔适应国际化,C语⾔的标准中不断加⼊了国际化的⽀持。

  • ++⽐如:加⼊了宽字符的类型 wchar_t 和宽字符的输⼊和输出函数,加⼊了头⽂件,其中提供了允许程序员针对特定 地区(通常是国家或者说某种特定语⾔的地理区域)调整程序⾏为的函数++

<locale.h>:

  • 因为不同地区的语言不同,所以产生了<locale.h>来适应不同地区的字符和一些格式,一些函数,一些行为。
  • 因为<locale.h>所以不同地区都可以在C语言上实现该地区的格式,语言和行为。

功能:提供的函数⽤于控制C标准库中对于不同的地区会产⽣不⼀样⾏为的部分。

在标准中,依赖地区的部分大致有以下⼏项:

  • 数字量的格式
  • 货币量的格式
  • 字符集
  • ⽇期和时间的表⽰形式

当然,当我们进行地区的修改后,<locale.h>内部也会发生影响,从而我们不想要将一些我们熟悉的函数被影响的话,我们需要使用一下宏定义:

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

setlocale:

  • 用于我们修改地区后,对<locale.h>内部的某些函数进行修改和影响
  • 它分为两种修改方式,一种是 "C" (正常模式),另一种是 " " (本地模式)

原型:

复制代码
 char* setlocale (int category, const char* locale);
  • int categorty 表示的是上文中的修改方式
  • 而const char*locale 表示的就是该函数的两种修改方式。

实例:

复制代码
int main()
{

  setlocale(LC_ALL,"c");

  return 0;

}

宽字符:

和普通字符相比,普通字符在控制台中占据的是一个字节,而宽字符则占据了两个字节。

宽字符的打印:

  • ++如若要打印宽字符,要加上<locale.h>作为头文件。++
  • ++且宽字符的字面量必须加上前缀"L",否则C语言会把字面量当作窄字符类型(普通字符)处理。++
  • ++前缀"L"在单引号前面,表示宽字符,对应 wprintf()的占位符为 %c;在双引号前面,表示宽字符串,对应 wprintf()的占位符为 %1s。++

实例:

复制代码
#include <stdio.h>
#include<locale.h>
int main()
{
   setlocale(LC_ALL, "");
   wchar_t ch1 = L'●';
   wchar_t ch2 = L'★';
 
 
   wprintf(L"%lc\n", ch1);
   wprintf(L"%lc\n", ch2);

   return 0;
}
相关推荐
天空'之城39 分钟前
C 语言工业级通用组件手写 23:卡尔曼滤波(简易版)
c语言·卡尔曼滤波·嵌入式算法·工业级组件
888CC++1 小时前
C语言与C++的区别:从面向过程到面向对象
java·c语言·c++
库玛西3 小时前
C++ 运行时多态 :核心总结与原理图解
c语言·c++·笔记
天空'之城5 小时前
C 语言工业级通用组件手写 21:限幅消抖滤波
c语言·嵌入式算法·工业级组件·限幅消抖滤波
Aurorar0rua5 小时前
CS50 x 2024 Notes Algorithms - 07
c语言·开发语言·学习方法
神罚天下ET6 小时前
典型arm位单片机启动流程(从上电到main.c)
c语言·arm开发·单片机
mifengxing8 小时前
LeetCode 189 轮转数组|3种解法拆解,从暴力到O(1)原地最优解
数据结构·算法·leetcode
MIngYaaa5208 小时前
2026暑期牛客多校3 2026-7-24
数据结构·算法·000
2501_937860948 小时前
Java 集合底层深度剖析:Map 与 Set、二叉搜索树、哈希表全解
java·数据结构·散列表
Hommy889 小时前
【剪映小助手】字符串列表转对象接口(Str List To Obds)
数据结构·list·剪映小助手·视频剪辑自动化·剪映api·开源剪映小助手