gpt4 book ai didi

string - 如何 PInvoke 多字节 ANSI 字符串?

转载 作者:行者123 更新时间:2023-12-02 03:54:30 25 4
gpt4 key购买 nike

我正在为一个不支持 Unicode 字符串但支持多字节 ANSI 字符串的库开发 PInvoke 包装器。在调查有关该库的 FxCop 报告时,我注意到所使用的字符串编码(marshal)处理有一些有趣的副作用。 PInvoke 方法使用“最佳拟合”映射来创建单字节 ANSI 字符串。为了便于说明,一种方法如下所示:

[DllImport("thedll.dll", CharSet=CharSet.Ansi)]
public static extern int CreateNewResource(string resourceName);

使用包含非 ASCII 字符的字符串调用此函数的结果是 Windows 找到一个“结束”字符,通常这看起来像是“???”。如果我们假设“a”是非 ASCII 字符,那么将“cat”作为参数传递将创建一个名为“c?t”的资源。

如果我遵循 FxCop 规则中的指导方针,我最终会得到如下结果:

[DllImport("thedll.dll", CharSet=CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)]
public static extern int CreateNewResource([MarshalAs(UnmanagedType.LPStr)] string resourceName);

这会带来行为上的改变;现在,当无法映射字符时,会引发异常。这让我担心,因为这是一个重大更改,所以我想尝试将字符串编码为多字节 ANSI,但我看不到这样做的方法。 UnmanagedType.LPStr指定为单字节 ANSI 字符串 LPTStr will be Unicode or ANSI depending on the system, and LPWStr is not what the library expects.



How would I tell PInvoke to marshal the string as a multibyte string? I see there's a <code>WideCharToMultiByte()</code> API function, could I change the signature to expect an IntPtr到我在非托管内存中创建的字符串?看来这仍然存在当前实现中存在的许多问题(它仍然可能必须删除或替换字符),所以我不确定这是否是一个改进。我还缺少另一种编码方法吗?

最佳答案

ANSI 多字节,并且 ANSI 字符串根据系统当前启用的代码页进行编码。 WideCharToMultiByte 的工作方式与 P/Invoke 相同。

也许您需要的是转换为 UTF-8。尽管 WideCharToMultiByte 支持这一点,但我认为 P/Invoke 不支持,因为不可能采用 UTF-8 作为系统范围的 ANSI 代码页。此时,您将考虑将字符串作为 IntPtr 传递,尽管如果您这样做,您也可以使用托管 Encoding 类来执行此操作转换,而不是 WideCharToMultiByte

关于string - 如何 PInvoke 多字节 ANSI 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/808154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com