【发布时间】:2012-10-28 15:46:20
【问题描述】:
问题标题基本上就是我想问的:
[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*在监视窗口中正确反映了相应的 utf-8 字符(包括韩语位)。
这是一个截图(包含更多细节):
如您所见,initialScriptText[0] 返回单个 byte(char): 'B' 并且char* initialScriptText 的内容在 VS 监视窗口中正确显示(包括韩文)。
通过char 指针,似乎英语每个char 保存为一个byte,而韩语似乎每个char 保存为两个字节。 (截图中的韩语单词为3个字母,因此保存为6个字节)
这似乎表明每个“字母”不是保存在相同大小的容器中,而是因语言而异。 (可能提示类型?)
我试图在纯 c++ 中实现相同的结果:读取 utf-8 文件并将结果保存为 char*。
这是我尝试读取 utf-8 文件并在 c++ 中转换为 char* 的示例:
观察:
- 从
wchar_t*转换为char*时出现视觉损失 - 由于结果,s8正确显示字符串,我知道我已经将
wchar_t*中的utf-8文件内容成功转换为char* - 由于“结果”保留了我直接从文件中获取的字节,但我得到的结果与我通过 c# 得到的结果不同(我使用了同一个文件),我得出的结论是 c# marshal 已通过其他一些程序将文件内容进一步更改为
char*。
(屏幕截图还显示了我在使用 wcstombs 时的严重失败)
注意:我使用的是来自 (http://utfcpp.sourceforge.net/) 的 utf8 标头
请纠正我的代码/观察中的任何错误。
我希望能够模仿我通过 c# marshal 得到的结果,并且在经历了所有这些之后我意识到我完全被卡住了。有什么想法吗?
【问题讨论】:
-
UTF-8 是一种可变宽度编码,因此 yes 字符可以表示为 1 个或多个字节。查看 Wikipedia 文章了解详情。
标签: c# c++ marshalling