首页 > C > 数据类型与变量 阅读:57,774

ASCII表与编码,UNICODE编码

< 上一页 字符型 整型 下一页 >

字符包含英文字母、希腊字符、中文字、日文等各种符号。字符在计算机中是通过字符编码的形式存储的。目前最流行的字符编码包括:ASCII码和UNICODE码。

ASCII码是单字节编码系统,它使用指定的 7 位或 8 位二进制数组合来表示 128  256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0  9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:

编码0-31127 33个字符是控制字符和通信专用字符。其中控制字符:LF(换行)、CR(回车)、 FF(换页)、DEL(删除)、BS(退格)BEL(振铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为 8910  13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

编码32-12695个字符包括了编码32为空格,编码48-57为“0”到“9”十个阿拉伯数字;编码65-9026个大写英文字母,编码97-122号为26个小写英文字母,其余为一些标点符号、运算符号等。

同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。目前许多基于x86的系统都支持使用扩展ASCII。扩展 ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。

常见ASCII码的大小规则:0 < … < 9  A < … < Z  a < … < z。记住几个常见字母的ASCII码大小:“A”为65;“a”为97;“0”为 48

ASCII编码只能表示有限的字符数。为了能够将世界上所有的字符都纳入编码范围,UNICODE字符编码便产生了。在UNICODE字符编码中,经常采用的是用2个字节或4个字节来表示一个字符。UNICODE编码的具体实现包括UTF-8UTF-16UTF-32。其中UTF-8中的字符占用的字节可以从14个,而UTF-162个字节,UTF-324个字节。

C语言里,ASCII字符类型数据用char来表示。一个char类型的数据,占用1个字节大小的存储空间,即sizeof(char)=1。而UNICODE字符类型(宽字符类型)用wchar_t来表示(注意,C语言是大小写敏感的,无论是数据类型或者变量,大写和小写是不同的)。而wchar_t的存储空间的长度则和系统有关。如Windows下通常2 bytes,因为宽字符编码定为UTF-16Unixgcc可以选2/4bytes,通常是4bytes,宽字符编码为UTF-32

sizeof(wchar_t) = 2 //Windows平台

sizeof(wchar_t) = 4 //Linux平台

上面的sizeof是用来计算C语言数据类型或者变量在内存中存储长度的一个操作符。这个操作符在以后的程序代码里会经常用到。

在程序里,可以定义一个字符变量来存放一个字符数据,比如:

char c=’a’;

wchar_t wc=L’a’;

 

#include <wchar.h>  

#include <locale.h>  

#include <stdlib.h>  

#include <stdio.h>  

#include <string.h>   

int main(void)   

{   

    setlocale(LC_ALL,"zh_CN.UTF-8"); 

    wchar_t a1[10] = L"你好";

 

    wchar_t c = L'A';

    wchar_t a2[] = L"Hello!";

    printf("%d\n", sizeof(c));

    printf("%d\n", sizeof(a1));

 

    wprintf(L"this is a test !\n"); 

    wprintf(L"%d\n ",wcslen(a2));    

    wprintf(L"%ls\n ",a2);   

    return 0;

}

 

其中,字符常量a 需要用单引号括起来,而UNICODE字符,在Windows上需要在前面在一个L,来表示宽字符。而cwc是一个用来存放常量字符的变量。即变量cwc的值此刻的值是’a’L’a’

此外需要注意的是,字符类型char也分为有符号类型和无符号类型:unsigned charsigned char。如果char类型之前没有加上unsigned或者signed,那么这个char类型是有符号类型还是无符号类型呢?这个没有定论,取决于编译器的实现。所以下面的代码不具有可移植性:

char c;

...

if (c<0)

{

    Do something;//伪代码

}

 

在有的平台上,char可能是无符号类型,那么c不可能小于0。所以,为了代码的可移植性,可以在char之前明确的加上 signed 或者unsigned

< 上一页 字符型 整型 下一页 >

周哥教IT,分享编程知识,提高编程技能,程序员的充电站。跟着周哥一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

当你决定关注「周哥教IT」,你已然超越了90%的程序员!

IT黄埔-周哥教IT技术交流QQ群:213774841,期待您的加入!

二维码
微信扫描二维码关注