c# – DllImport – ANSI与Uni​​code

c# – DllImport – ANSI与Uni​​code,第1张

概述我对下面的测试问题的可能答案有一些疑问: 问题:您编写以下代码段以使用平台调用从Win32应用程序编程接口(API)调用函数. string personName = "N?el";string msg = "Welcome" + personName + "to club"!";bool rc = User32API.MessageBox(0, msg, personName, 0); 您需 我对下面的测试问题的可能答案有一些疑问:

问题:您编写以下代码段以使用平台调用从Win32应用程序编程接口(API)调用函数.

string personname = "N?el";string msg = "Welcome" + personname + "to club"!";bool rc = User32API.MessageBox(0,msg,personname,0);

您需要定义一个最佳编组字符串数据的方法原型.您应该使用哪个代码段?

// A.[Dllimport("user32",CharSet = CharSet.Ansi)]public static extern bool MessageBox(int hWnd,string text,string caption,uint type);}// B.[Dllimport("user32",EntryPoint = "MessageBoxA",[MarshalAs(UnmanagedType.LPWStr)]string text,[MarshalAs(UnmanagedType.LPWStr)]string caption,uint type);}// C. - Correct answer[Dllimport("user32",CharSet = CharSet.Unicode)]public static extern bool MessageBox(int hWnd,uint type);}// D.[Dllimport("user32",uint type);}

为什么正确的答案是C?不可能它也是A?唯一的区别是它将是ANSI而不是Unicode.

我知道它不能是D,因为我们选择Unicode作为字符集,然后使用ANSI函数作为入口点.

B为什么不工作?

解决方法
string personname = "N?el";

这个字符串被这个问题所询问的确切问题弄乱了.毫无疑问,原版中看起来像这样:

string personname = "Nöel";

ö往往是一个问题,它的字符代码不是ASCII字符集,默认系统代码页可能不支持.这是当你pinvoke ANSI版本的MessageBox,也就是MessageBoxA时使用的.真正的函数是MessageBoxW,它采用utf-16编码的Unicode字符串.

MessageBoxA是旧版windows中使用的遗留函数,早在程序仍然使用8位字符串时.它还没有完全消失,许多C和C程序仍然倾向于使用8位编码. MessagBoxA通过将8位编码字符串转换为Unicode然后调用MessageBoxW来实现.如果您首先使用Unicode字符串,则速度慢且有损.

所以评价4个版本:

答:使用MessageBoxA 8位编码,有风险.B:使用MessageBoxA Unicode,失败.C:使用MessageBoxW Unicode,不错D:使用MessageBoxA Unicode,失败.

总结

以上是内存溢出为你收集整理的c# – DllImport – ANSI与Uni​​code全部内容,希望文章能够帮你解决c# – DllImport – ANSI与Uni​​code所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1222498.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存