星期二, 十二月 23, 2003

Book:内存管理算法和C/C++实现

《Memory Management Algorithms and Implementation in C/C++》
少有的介绍内存管理比较深入的书, 从Intel x86的内存管理的硬件构架, 到操作系统(DOS,Linux,Windows)的内存管理策略直到上层应用软件的内存管理. 深入透彻.
相比那些泛泛而谈的书, 我更喜欢这类面向特定专题, 讲解深入的书, 尤其是介绍内存管理的书, 比较少见. 可惜没有中文版, 我看起来费劲多了.
Amazon上的链接:http://www.amazon.com/exec/obidos/tg/detail/-/1556223471/qid=1072276540/sr=1-1/ref=sr_1_1/103-8344187-6939850?v=glance&s=books

星期六, 十二月 06, 2003

CFile与CStdioFile

CStdioFile继承自CFile,区别在于:
CFile不支持text模式,而CStdioFile支持text和binary两种模式,缺省在text模式.
CFile不会对回车换行做任何转换操作。
CStdioFile在text模式下会将\n转换为\r\n,所以如果输出\r\n,反而转成了\r\r\n
CStdioFile在binary模式下和CFile一致,不作回车换行的自动转换
CStdioFile比CFile多支持了WriteString接口,可以支持直接输出CString字符串,使用方便,
但此时输出字符串中不可能含字符0,因为0为CString的结束符。如果需要输出0到文件,还是要使用Write接口。WriteString的另一个区别是它会做字符表的转换,在Unicode版本的代码中(Project中定义了_Unicode),WriteString会自动将参数从 Unicode转到MBCS,再存入文件。而Write就不会做这个转换,Write只是按BYTE一个接一个写入文件,所以如果是Unicode的字符串,写到文件中也是Unicode的。不过WriteString在做字符转换时用了wctomb函数,这个函数又要求setlocale来设置正确的代码页,否则wctomb会在转中文时返回失败,所以WriteString在输出Unicode字符串时稍微麻烦一些。
相对来说,我更喜欢使用CStdioFile。
(要在控制台(win32 console)程序中使用MFC,只需包含afx .h并在工程设置中加入MFC支持即可。)

星期三, 十二月 03, 2003

中文编码转换

最近编程时需要用到将中文字符串在GB2312和UTF-8之间转换,UTF-8是Unicode的一种常见编码方式(便于和老的只处理ASCII 的系统兼容),GB2312则是中国国家汉字编码标准(与GBK兼容),UTF-8与GB2312在汉字编码上是完全不同的,在网上找这方面的中文资料很困难,最后是在一些片断代码中找到转换方法:

char strU [100]; //UTF-8编码

WCHAR* strW; //Unicode编码

int c = MultiByteToWideChar (CP_UTF8, 0, strU, -1 ,NULL,0);

strW = new WCHAR[i];

MultiByteToWideChar (CP_UTF8, 0, strU, -1, strW, c);

c = WideCharToMultiByte(CP_ACP, 0, strW,-1, NULL, 0, NULL, NULL);

char *strG = new char[c]; //GB2312编码

WideCharToMultiByte (CP_ACP, 0, strW, -1, strG, i, NULL, NULL);


上面的代码可以将strU(UTF-8字符串)转换到strG(GB2312),过程是先将strU转到Unicode(WCHAR)的strW,再从 Unicode转换到GB2312的strG,反之从GB2312转到UTF-8也是一样,需要用Unicode中转一下。
虽然我已经测试这段代码工作正常,可我不太明白的是后一步的转换使用的是CP_ACP代码页(ANSI代码页),为什么不用936代码页(GBK)呢? 可能是因为我的中文win2000缺省ANSI代码页是936。