【发布时间】:2016-02-20 03:24:30
【问题描述】:
我在 c# WPF 项目中调用了一个 C 接口方法。该方法通过StringBuilder 返回一个 2 字节的 Unicode(UTF-16,如果我没记错的话)字符串。我试图在 WPF TextBox 控件中显示这个 2 字节的 Unicode 字符串,并将其写入 .txt 文件。
TextBox 和 .txt 文件中的结果似乎都无法读取。
我尝试将 Unicode (UTF-16) 字符串转换为 ANSI,但这也不起作用。
以下是DllImport 和我尝试将字符串转换为可读内容的代码示例。
[DllImport("cdll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
extern static int ChannelID(int uHandle, uint uChannel, StringBuilder szID);
for (uint i = 0; i <= numChannels - 1; i++)
{
StringBuilder sbId = new StringBuilder(32);
ChannelID(_handle, i, sbId);
string val = "";
UnicodeEncoding unicode = new UnicodeEncoding();
val = Encoding.Default.GetString(Encoding.Convert(Encoding.Unicode, Encoding.Default, unicode.GetBytes(sbId.ToString())));
File.AppendAllText(System.AppDomain.CurrentDomain.BaseDirectory + "dump.txt", sbId.ToString() + " - ", Encoding.Unicode);
textBox1.AppendText(val + " - ");
textBox1.AppendText(sbId.ToString() + " - ");
}
正在从与蓝牙连接的设备中读取字符串。该设备用于测量温度、空气湿度、气压等...
所以输入是一个Unicode字符串,例如°c,屏幕和txt文件中的输出应该是这个的可读版本(例如ansi)。
另外一点可能很重要的信息,C 方法最初是在一个 excel 宏 VBA 项目中使用的,因此使用了这个 2 字节的 Unicode 编码。
解决方案
问题与 DllImport 中的 CharSet 无关,而是与 CallingConvention 相关。在联系了制作 C 库的人之后,他们告诉我他们给了我们一个错误的示例代码。正确的DllImport 是这个:
[DllImport("cdll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
添加此数据后,数据正确通过,无需进行任何转换。
【问题讨论】:
-
输入和预期输出是什么?
-
我已经在我的问题的文件中添加了输入(来自 c 方法的结果)和我期望的输出。
-
如果方法设法将字符串正确地放入
StringBuilder,则根本不需要转换。只需使用szID.ToString()获取字符串,您可以在写入文件并将其放入文本框中时直接使用它。如果不是,那么你有一些不是 UFT-16 字符串而是其他的东西,所以要转换它你需要知道它是什么。