C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是最常见的字符编码单位。但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码。
  C95标准化了两种表示大型字符集的方法:宽字符(wide character,该字符集内每个字符使用相同的位长)以及多字节字符(multibyte character,每个字符可以是一到多个字节不等,而某个字节序列的字符值由字符串或流(stream)所在的环境背景决定)。

  自从1994年的增补之后,C语言不只提供char类型,还提供wchar_t类型(宽字符),此类型定义在stddef.h 头文件中。wchar_t指定的宽字节类型足以表示某个实现版本扩展字符集的任何元素。

  在多字节字符集中,每个字符的编码宽度都不等,可以是一个字节,也可以是多个字节。源代码字符集和运行字符集都可能包含多字节字符。多字节字符可以被用于字符的常量、字符串字面值(string literal)、标识符(identifier)、注释(comment),以及头文件。

  C语言本身并没有定义或指定任何编码集合,或任何字符集(基本源代码字符集和基本运行字符集除外),而是由其实现指定如何编码宽字符,以及要支持什么类型的多字节字符编码机制。

  虽然C标准没有支持Unicode字符集,但是许多实现版本使用Unicode转换格式UTF-16和UTF-32来处理宽字符。如果遵循Unicode标准,wchar_t类型至少是16或32位长,而wchar_t类型的一个值就代表一个Unicode字符。

  UTF-8是一个由Unicode CONsortium(万国码联盟)定义的实现,可以表示Unicode字符集的所有字符。UTF-8字符所使用的空间大小从一个字节到四个字节都有可能。

  多字节字符和宽字符(也就是wchar_t)的主要差异在于宽字符占用的字节数目都一样,而多字节字符的字节数目不等,这样的表示方式使得多字节字符串比宽字符串更难处理。比方说,即使字符'A'可以用一个字节来表示,但是要在多字节的字符串中找到此字符,就不能使用简单的字节比对,因为即使在某个位置找到相符合的字节,此字节也不见得是一个字符,它可能是另一个不同字符的一部分。然而,多字节字符相当适合用来将文字存储成文件。

  C提供了一些标准函数,可以将多字节字符转换为wchar_t,或将宽字符转换为多字节字符。比方说,如果C 编译器使用Unicode 标准的UTF-16 和UTF-8,那么下面调用wctomb()函数就可以获得字符的多字节表示方式(注:wctomb = wide character to multibyte)。

转载于:https://www.cnblogs.com/zhwl/archive/2012/11/23/2784261.html

C语言中的多字节字符与宽字符相关推荐

  1. linux 宽字符串,C语言中的多字节字符与宽字符

    C语言原本是在英文环境中设计的,主要的字符集是7位的ASCII码,8位的byte(字节)是最常见的字符编码单位.但是国际化软件必须能够表示不同的字符,而这些字符数量庞大,无法使用一个字节编码. C95 ...

  2. C语言学习(十二)C语言中的字符(宽字符与窄字符)、从字符谈谈C语言的编码、转义字符

    C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 目录 C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 英文字符 字符的表示 ...

  3. c语言中用于判断ch是否是字符的表达式,最新C语言复习题集资料

    精品文档 C语言复习题集 一. 判断题 1-1.C语言程序是从源文件的第一条语句开始执行的. 正确答案:F 1-2.C语言中的变量名不区分大小写. 正确答案:F 1-3.若变量定义为double x; ...

  4. c语言中不能将字符串赋值给字符数组

    参考文章:c语言中,为什么字符串可以赋值给字符指针变量 1.可以将字符串赋值给指向字符的指针p,而不能将字符串赋值给一个字符数组. char a[10]="hello";//正确的 ...

  5. php byte转 宽字符,C++宽字符与普通字符的转换实例详解

    C++宽字符与普通字符的转换实例详解 把字符串转换成宽字符串, 实例代码: wstring string2Wstring(string sToMatch) { #ifdef _A_WIN int iW ...

  6. 在c语言中合法标识符的第一个字符必须是,c语言合法标识符判断规则是什么?...

    规则是:1.标识符的第一个字符必须是字母(a~z或A~Z)或下划线(_):2.后面跟的字符是由任意字母.下划线(_).数字组成:3.标识符中的大小写字母是有区别的,代表不同含义:4.标识符不能是关键字 ...

  7. C语言中表示输出类型的格式字符

    1.%d-以十进制形式输出带符号整数: 2.%o-以八进制形式输出无符号整数(不输出前缀O); 3.%x-以十六进制形式输出无符号整数(不输出前缀OX); 4.%u-以十进制形式输出无符号整数; 5. ...

  8. C语言中如何输出一些特殊的字符

    在编写程序的时候 我们可能会遇到这样的问题 我们在输出一些特殊字符的时候会无法输出  比如说单双引号  这时候我们就需要在想输出的符号面前加上反斜杠'\'  比如: printf("我说:\ ...

  9. c语言中黑色的鼠标变宽,大师解答win7系统鼠标光标变成黑色方块了的设置方案....

    相信大多数朋友在使用电脑的过程中,会出现win7系统鼠标光标变成黑色方块了的状况,当遇到win7系统鼠标光标变成黑色方块了这种情况,我们应该如何解决呢?其实大部分的朋友都还不知道win7系统鼠标光标变 ...

最新文章

  1. 中国工程院院士和科学院院士有什么区别,谁贡献很大却没有入院士?
  2. oracle中orand使用,Postgres兼容Oracle研究——orafce调研
  3. java回调函数的生命_Java的回调函数 - choaklin 的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. Fogengine概述
  5. php添加用户信息进入数据库,dedecms用户将信息插入数据库
  6. Java MVC 1.0规范开始进入公开评审阶段
  7. 遵义 计算机应用能力,遵义市人力资源和社会保障局
  8. Dkhadoop虚拟机安装操作演示教程
  9. 使用Excel进行傅立叶分析Fourier
  10. 腾讯围棋AI技术PhoenixGo正式开源
  11. BAT机器学习面试1000题系列大集合整理(320)
  12. 10---OpenCV:图像进阶操作之连通区域分析
  13. ab153x-ut apk 洛达1562a蓝牙检测工具 真)
  14. 什么是 ECC 内存?(memory with ECC)
  15. 用ccs创建一个工程文件
  16. 猜数字游戏(小游戏编码)
  17. c#轻松实现磁性窗口
  18. Ecshop文件结构,二次开发
  19. 快速沃尔什变换(FWT)讲解 解决集合卷积的方法
  20. 一文讲透图像分割经典网络:FCN、Unet、DeepLabV3+、Vnet、Unet++

热门文章

  1. mysql的安全管理_MySQL安全管理
  2. efuse 加密文件 linux,乐鑫关于“故障注入”和 “eFuse 保护”的安全建议 (CVE-2019-17391)...
  3. Linux学习笔记---Cortex-A7 常用汇编指令
  4. SpringMVC中转发和重定向
  5. np.array 的shape (2,)与(2,1)的分别是什么意思
  6. 图像算法九:【图像特征提取】特征降维、PCA人脸特征抽取、局部二进制
  7. python处理数据集并制作词云图
  8. 一篇非常有用的文章-《台湾清华彭明辉教授的研究生手册》如何发现一个研究课题?
  9. Qt界面美化 QSS
  10. 手动升级 Confluence - 规划你的升级