1.XP和win7下,Date()返回时间格式不同问题。
用C++Builder帮一个朋友写个软件,以当天日期为文件名进行新建文件,利用的是fopen函数,例如2012-03-27.txt。
实现方法如下:
AnsiString date=Date();
String fileName=DateToStr(date)+".txt";
FILE*fp;
if((fp=fopen(filename.c_str(),"w")==NULL)
{
// 新建文件出错!
}
写完XP下正常运行,但是在win7下出现新建文件出错的错误。
初以为是fopen在win7的问题,上网搜了下,有人说是win7的UAC问题,需要关闭UAC。
后来将fileName打印发现,在xp下的“2012-03-27.txt”在win7却是"2012/03/27.txt"。即,在win7的Date()返回的时间格式与xp不同,而且是要命的斜杠,直接变成了目录。
在对应文件路径下不存在名为2012的文件夹自然新建文件出错。
谨记。
2. Unicode和utf-8
Unicode字符集(简称为UCS),国际标准组织于1984年4月成立ISO/IEC JTC1/SC2/WG2工作组,针对各国文字、符号进行统一性编码。采用16位编码体系,内容包含符号6811个,汉字20902个,韩文拼音11172个,造字区6400个,保留20249个,共计65534个。可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。
UTF-8,是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
编码规则:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于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
下面,以汉字“严”为例,演示如何实现UTF-8编码。
已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。