ANSI和Unicode练习后记


首先,再次问候大家,春节好!祝愿D语言社区兴旺发达,祝愿JavaEye蒸蒸日上!

在前文中,已经讨论了如何调用ANSI和多字节的函数。本文目的是关于在D中如何更好应用。当然,很多人认为完全可以使用宽字符的函数,但是,有时候,你要调用的函数是ANSI函数(例如WinExec,仅仅有ANSI版本,不支持Unicode,当然你可以使用麻烦的ShellExecuteEx),你就必须了解Unicode的相关知识。建议阅读前文 http://ideage.iteye.com/blog/119177,运行相关例子,认真揣摩调用的几个用法。


1.首先要明白你使用的char是什么格式。char在D中,有两种格式:ANSI,Unicode。ANSI是和C兼容的。如果你的源码保存格式是UTF8,或者UTF32,那么你的char的格式就是Unicode;否则ANSI。明白char的格式,调用相关函数就好办了。

2.根据格式调用。如果是ANSI格式,调用ANSI函数时,使用std.string.toStringz函数就可以了。如果源码是Unicode格式,如果继续使用前面的方法,调用会失败。很幸运的,你只要理解了格式,就知道解决办法。

3.源码是Unicode格式时,调用ANSI函数,要使用字节转换。代码说话:
wchar[] a2w( char[] a ) 
{
	return toUTF16(a); 
} 

char[] wcs2mbz(wchar[] ws)    
{    
    uint codepage =  1; //2000/+    
    char[] rz;     
    rz.length = WideCharToMultiByte(codepage, 0, ws.ptr, ws.length, null, 0, null, null) + 1;    
    WideCharToMultiByte(codepage, 0, ws.ptr, ws.length, rz.ptr, rz.length, null, null);    
    rz[rz.length-1] = 0;    
    rz.length = rz.length-1;    
    return rz;    
}    

char[] uc2cz(char[] a)
{
	return wcs2mbz(a2w(a));
}



调用uc2cz转换,然后传递转换后的指针就可以了:
char[] files="c:\NotePad.exe";
WinExec( uc2cz(files).ptr,1);

4.上述的很简单,如果有错误,请大家指正!谢谢!

你可能感兴趣的:(C++,c,mysql,C#,D语言)