目录
- ASCII
A上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。SCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
- GB2312
简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号(两个字节可以表示2^^16 = 65536个汉字j)。注意GB编码和unicode编码和utf-8编码没有关系。
- unicode
unicode 将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。但是需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
- UTF-8
***互UTF-8是Unicode的实现方式之一。***联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上基本不用。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
- 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
- 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
- Unicode与UTF-8之间的转换(很多文本编辑软件都有下面的选项)
- ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。
- Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。
- Unicode big endian编码与上一个选项相对应。我在下一节会解释little endian和big endian的涵义。
- UTF-8编码,也就是上一节谈到的编码方法。
- Little endian和Big endian
上一节已经提到,Unicode码可以采用UCS-2格式直接存储。以汉字"严"为例,Unicode码是4E25,需要用两个字节存储,一个字节是4E,另一个字节是25。存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。
- UTF-16
UTF-16 使用两字节的无符号整型来保存字符,这是Unicode的另一种保存形式。当然了无法使用这16个位来表示所有的字符,但是当字符集已经确定而且可以使用16位表示时,使用UTF-16可以节省存储空间(特别是东亚字符集)。当UTF-16无法表示某些字符时,其是可以扩展的,扩展的形式见http://blog.csdn.net/mylinx/article/details/6874414。
UTF-16 LE是windows上默认的Unicode编码方式,使用wchar_t表示。所有wchar_t *类型的字符串(包括硬编码在.h/.cpp里的字符串字面值),VC都自动采用UTF-16的编码。UTF-16的劣势没有统一的表示UTF-16编码的字符类型。C++98/03里对wchar_t的定义是非常宽泛的。这导致在Windows平台上,wchar_t是2字节的;在Unix-like系统上是4字节的。
2.C语言常用函数 [Index]
- 时间
- time_t 是一个非常大的整数
- tm结构
struct tm{ int tm_sec; /* 秒 – 取值区间为[0,59] */ int tm_min; /* 分 - 取值区间为[0,59] */ int tm_hour; /* 时 - 取值区间为[0,23] */ int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */ int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */ int tm_year; /* 年份,其值等于实际年份减去1900 */ int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */ int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */ int tm_isdst;//夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负 };
- time_t time(time_t *t);//从GMT1970、1、1 00:00:00 到当前的秒数
- struct tm *gmtime(const time_t *time);//将unix时间戳转化为GMT(格林威治时间)时间的tm格式
- struct tm *localtime(const time_t *time);//将unix时间戳转化为本地时间的tm格式,和上面返回的时间有时差。
- char *asctime(const struct tm *tblock);//将tm结构的时间转化为字符串,注意字符串的最后一个有效符号为换行符
- char *ctime(time_t *time);直接unix时间戳转化为本地时间的字符串格式(非GMT时间)
- clock_t clock(void);//获得cpu当前时间,是一个整数(近似值),程序从启动到调用clock()函数之间所使用的CPU的click数。
- time_t mktime(cosnt struct tm *t);//将tm类型的数据转换为unix时间戳。
- double difftime(time_t t2 , time_t t1);//返回两个时间戳之间的秒差。