问题标题基本上就是我想问的:[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调试器中看到:
char*
char*
正确反射(reflect)了监视窗口中对应的utf-8字符(包括韩语中的位)。 这是屏幕截图(更多详细信息):
如您所见,
initialScriptText[0]
返回单个byte(char)
:'B'并且char* initialScriptText
的内容在VS watch窗口中正确显示(包括韩语)。通过
char
指针,似乎英语被保存为每个byte
一个char
,而朝鲜语似乎被保存为每个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#编码所得到的结果,经过所有这些工作后,我意识到我完全陷入了困境。有任何想法吗?
最佳答案
没有。托管代码中没有“utf-8字符串”之类的东西,字符串始终以utf-16编码。使用默认系统代码页完成与LPStr之间的封送处理。除非您使用代码页949,否则在调试器中看到朝鲜字形就非常引人注目。
如果与utf-8互操作非常困难,那么您需要在pinvoke声明中使用byte []。然后使用System.Text.Encoding.UTF8来回转换自己。使用其GetString()方法将byte []转换为字符串,使用其GetBytes()方法将字符串转换为byte []。如果可能,请在 native 代码中使用wchar_t []避免所有这些操作。