ANSI和Unicode练习后记

首先,再次问候大家,春节好!祝愿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函数,要使用字节转换。代码说话:

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.上述的很简单,如果有错误,请大家指正!谢谢!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值