三、Windows通用对话框—Unicode文件I/O
对于本书中的大多数程序,您都不必注意Unicode和非Unicode版的区别。例如,在POPPAD3的Unicode中,编辑控件将保留Unicode文字和使用Unicode字符串的所有通用对话框。例如,当程序需要搜索和替换时,所有的操作都会处理Unicode字符串,而不需要转换。
不过,POPPAD3得处理文件I/O,也就是说,程序不能闭门造车。如果Unicode版的POPPAD3获得了编辑缓冲区的内容并将其写入磁盘,文件将是使用Unicode存放的。如果非Unicode版的POPPAD3读取了该文件,并将其写入编辑缓冲区,其结果将是一堆垃圾。Unicode版读取由非Unicode版储存的文件时也会这样。
解决的办法在于辨别和转换。首先,在POPFILE.C的PopFileWrite函数中,您将看到Unicode版的程序将在文件的开始位置写入0xFEFF。这定义为字节顺序标记,以表示文本文件含有Unicode文字。
其次,在PopFileRead函数中,程序用IsTextUnicode函数来决定文件是否含有字节顺序标记。此函数甚至检测字节顺序标记是否反向了,亦即Unicode文本文件在Macintosh或者其它使用与Intel处理器相反的字节顺序的机器上建立的。这时,字节的顺序都经过翻转。如果文件是Unicode版,但是被非Unicode版的POPPAD3读取,这时,文字将被WideCharToMultiChar转换。WideCharToMultiChar实际上是一个宽字符ANSI函数(除非您执行远东版的Windows)。只有这时文字才能放入编辑缓冲区。
同样地,如果文件是非Unicode文本文件,而执行的是Unicode版的程序,那么文字必须用MultiCharToWideChar转换。