首先,再次问候大家,春节好!祝愿D语言社区兴旺发达,祝愿JavaEye蒸蒸日上!
在前文中,已经讨论了如何调用ANSI和多字节的函数。本文目的是关于在D中如何更好应用。当然,很多人认为完全可以使用宽字符的函数,但是,有时候,你要调用的函数是ANSI函数(例如WinExec,仅仅有ANSI版本,不支持Unicode,当然你可以使用麻烦的ShellExecuteEx),你就必须了解Unicode的相关知识。建议阅读前文[url]http://ideage.iteye.com/blog/119177[/url],运行相关例子,认真揣摩调用的几个用法。
1.首先要明白你使用的char是什么格式。char在D中,有两种格式:ANSI,Unicode。ANSI是和C兼容的。如果你的源码保存格式是UTF8,或者UTF32,那么你的char的格式就是Unicode;否则ANSI。明白char的格式,调用相关函数就好办了。
2.根据格式调用。如果是ANSI格式,调用ANSI函数时,使用std.string.toStringz函数就可以了。如果源码是Unicode格式,如果继续使用前面的方法,调用会失败。很幸运的,你只要理解了格式,就知道解决办法。
3.源码是Unicode格式时,调用ANSI函数,要使用字节转换。代码说话:
调用uc2cz转换,然后传递转换后的指针就可以了:
char[] files="c:\NotePad.exe";
WinExec( uc2cz(files).ptr,1);
4.上述的很简单,如果有错误,请大家指正!谢谢!
在前文中,已经讨论了如何调用ANSI和多字节的函数。本文目的是关于在D中如何更好应用。当然,很多人认为完全可以使用宽字符的函数,但是,有时候,你要调用的函数是ANSI函数(例如WinExec,仅仅有ANSI版本,不支持Unicode,当然你可以使用麻烦的ShellExecuteEx),你就必须了解Unicode的相关知识。建议阅读前文[url]http://ideage.iteye.com/blog/119177[/url],运行相关例子,认真揣摩调用的几个用法。
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.上述的很简单,如果有错误,请大家指正!谢谢!