问题标题基本上就是我想问的:
[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*正确反射(reflect)了监视窗口中对应的utf-8字符(包括韩语中的位)。

  • 这是屏幕截图(更多详细信息):

    c# - MarshalAs(UnmanagedType.LPStr)-如何将utf-8字符串转换为char *-LMLPHP

    如您所见,initialScriptText[0]返回单个byte(char):'B'并且char* initialScriptText的内容在VS watch窗口中正确显示(包括韩语)。

    通过char指针,似乎英语被保存为每个byte一个char,而朝鲜语似乎被保存为每个char两个字节。 (屏幕截图中的韩语单词为3个字母,因此保存为6个字节)

    这似乎表明每个“字母”没有保存在相同大小的容器中,但是根据语言而有所不同。 (可能提示类型?)

    我正在尝试在纯c++中实现相同的结果:读取utf-8文件并将结果保存为char*

    这是我尝试读取utf-8文件并在c++中转换为char*的示例:

    c# - MarshalAs(UnmanagedType.LPStr)-如何将utf-8字符串转换为char *-LMLPHP

    观察结果:

    wchar_t*转换为char*
  • 的视觉损失
  • 由于结果,s8正确显示了字符串,我知道我已将wchar_t*中的utf-8文件内容成功转换为char*
  • 因为'result'保留了我直接从文件中获取的字节,但是我得到的结果与通过C#获得的结果不同(我使用了相同的文件),所以我得出结论,C#编码具有通过其他步骤将文件内容进一步变异为char*

  • (屏幕截图还显示了我在使用wcstombs时遇到的严重失败)

    注意:我正在使用(http://utfcpp.sourceforge.net/)中的utf8 header

    请纠正我的代码/观察中的任何错误。

    我希望能够模仿通过C#编码所得到的结果,经过所有这些工作后,我意识到我完全陷入了困境。有任何想法吗?

    最佳答案



    没有。托管代码中没有“utf-8字符串”之类的东西,字符串始终以utf-16编码。使用默认系统代码页完成与LPStr之间的封送处理。除非您使用代码页949,否则在调试器中看到朝鲜字形就非常引人注目。

    如果与utf-8互操作非常困难,那么您需要在pinvoke声明中使用byte []。然后使用System.Text.Encoding.UTF8来回转换自己。使用其GetString()方法将byte []转换为字符串,使用其GetBytes()方法将字符串转换为byte []。如果可能,请在 native 代码中使用wchar_t []避免所有这些操作。

    07-24 09:52
    查看更多