ASCII表与编码,UNICODE编码
字符包含英文字母、希腊字符、中文字、日文等各种符号。字符在计算机中是通过字符编码的形式存储的。目前最流行的字符编码包括:ASCII码和UNICODE码。
ASCII码是单字节编码系统,它使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:
编码0-31及127 共33个字符是控制字符和通信专用字符。其中控制字符:LF(换行)、CR(回车)、 FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
编码32-126共95个字符包括了编码32为空格,编码48-57为“0”到“9”十个阿拉伯数字;编码65-90为26个大写英文字母,编码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-8,UTF-16和UTF-32。其中UTF-8中的字符占用的字节可以从1到4个,而UTF-16占2个字节,UTF-32占4个字节。
在C语言里,ASCII字符类型数据用char来表示。一个char类型的数据,占用1个字节大小的存储空间,即sizeof(char)=1。而UNICODE字符类型(宽字符类型)用wchar_t来表示(注意,C语言是大小写敏感的,无论是数据类型或者变量,大写和小写是不同的)。而wchar_t的存储空间的长度则和系统有关。如Windows下通常2
bytes,因为宽字符编码定为UTF-16。Unix下gcc可以选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,来表示宽字符。而c和wc是一个用来存放常量字符的变量。即变量c和wc的值此刻的值是’a’和L’a’。
此外需要注意的是,字符类型char也分为有符号类型和无符号类型:unsigned
char和signed
char。如果char类型之前没有加上unsigned或者signed,那么这个char类型是有符号类型还是无符号类型呢?这个没有定论,取决于编译器的实现。所以下面的代码不具有可移植性:
char c;
...
if (c<0)
{
Do something;//伪代码
}
在有的平台上,char可能是无符号类型,那么c不可能小于0。所以,为了代码的可移植性,可以在char之前明确的加上 signed 或者unsigned。