- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
题目基本上就是我想问的:
[MarshalAs(UnmanagedType.LPStr)]
- 这如何将 utf-8 字符串转换为 char*?
当我尝试在 c# 和 c++ dll 之间进行通信时,我使用了上面的行;更具体地说,介于:
somefunction(char *string) [c++ dll]
somefunction([MarshalAs(UnmanagedType.LPStr) string text) [c#]
当我通过 c# 将我的 utf-8 文本 (scintilla.Text) 发送到我的 c++ dll 时,我在 VS 10 调试器中显示:
c#字符串成功转换为char*
生成的 char*
在监 window 口中正确反射(reflect)相应的 utf-8 字符(包括韩语中的位)。
这是一个屏幕截图(包含更多详细信息):
如您所见,initialScriptText[0]
返回单个 byte(char)
: 'B' 和 char* initialScriptText
在 VS 监 window 口中正确显示(包括韩语)。
通过 char
指针,似乎英语被保存为每个 char
一个 byte
,而韩语似乎被保存为两个每个 char
的字节数。 (截图中的韩文单词为3个字母,因此节省了6个字节)
这似乎表明每个“字母”都没有保存在相同大小的容器中,而是因语言而异。 (关于类型的可能提示?)
我试图在纯 C++ 中实现相同的结果:读取 utf-8 文件并将结果保存为 char*
。
这是我尝试读取一个 utf-8 文件并将其转换为 C++ 中的 char*
的示例:
观察:
wchar_t*
转换为 char*
时视觉损失wchar_t*
中的 utf-8 文件内容成功转换为 char*
char*
。 (屏幕截图还显示了我在使用 wcstombs 时的可怕失败)
注意:我使用的是来自 ( http://utfcpp.sourceforge.net/ ) 的 utf8 header
请纠正我在代码/观察中的任何错误。
我希望能够模仿我通过 c# marshal 获得的结果,并且在经历了所有这些之后我意识到我完全被卡住了。有什么想法吗?
最佳答案
[MarshalAs(UnmanagedType.LPStr)] - how does this convert utf-8 strings to char* ?
事实并非如此。托管代码中没有“utf-8 字符串”之类的东西,字符串始终以 utf-16 编码。 LPStr 的编码和编码是使用默认系统代码页完成的。这使得您在调试器中看到韩文字形非常引人注目,除非您使用代码页 949。
如果与 utf-8 的互操作是一项硬性要求,那么您需要在 pinvoke 声明中使用 byte[]。并使用 System.Text.Encoding.UTF8 自己来回转换。使用其 GetString() 方法将 byte[] 转换为字符串,其 GetBytes() 方法将字符串转换为 byte[]。如果可能,请在 native 代码中使用 wchar_t[] 来避免所有这些情况。
关于c# - MarshalAs(UnmanagedType.LPStr) - 这如何将 utf-8 字符串转换为 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13289171/
是否可以为 MarshalAs 属性类定义一个自定义的 UnmanagedType?具体来说,我想将 long int unix 时间转换为 DateTime 类型。像这样: [MarshalAs(U
有谁知道MarshalAs(UnmanagedType.ByValArray, SizeConst 当编码有大小限制时的 SizeCount。我看到如果大小大于 100000,则编码函数调用不起作用,
我正在尝试为 ITaskTrigger::GetTriggerString 方法(在 http://msdn.microsoft.com/en-us/library/windows/desktop/a
我正在尝试为 Windows 8.1 创建一个应用程序,作为应用程序的一部分,我正在尝试将 libgit2sharp 移植到 Windows 8.1 类库(而不是可移植类库)。我已经成功地转换了很多小
我正在尝试为 Windows 8.1 创建一个应用程序,作为应用程序的一部分,我正在尝试将 libgit2sharp 移植到 Windows 8.1 类库(不是可移植类库)。我已经设法转换了很多小问题
我将字节打包到一个结构中,其中一些对应于 Unicode 字符串。以下内容适用于 ASCII 字符串: [StructLayout(LayoutKind.Sequential)] private st
我想导入这样一个函数: [return: MarshalAs(UnmanagedType.LPWStr)] [DllImport("DLL.dll", EntryPoint="FuncUtf16",
嗯,有一些明显的区别: 固定缓冲区: 它们必须在 unsafe block 中声明(暗示整个项目必须使用 -unsafe 开关编译)。 使用固定缓冲区,包含的对象必须是固定的, 使用 MarshalA
题目基本上就是我想问的: [MarshalAs(UnmanagedType.LPStr)] - 这如何将 utf-8 字符串转换为 char*? 当我尝试在 c# 和 c++ dll 之间进行通信时,
这是一个简单的 C 代码(VS 2013 C++ 项目,“编译为 C”): typedef struct { bool bool_value; } BoolContainer; BoolCon
我是一名优秀的程序员,十分优秀!