码迷,mamicode.com
首页 > 编程语言 > 详细

【原创】解决untiy使用c++dll过程中, 字符串乱码的问题.

时间:2016-11-24 14:21:31      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:api   try   throw   需求   地址   参数   中文   man   except   

环境: 
1. c++ dll  <--> c# dll <--> unity
2. c++, c# 文件编码都为 UTF8
3. c++ dll return 多字节字符串.

问题:
1. 从c++接收到的字符串,在unity编辑器中可以正常显示. 
2. 而发布工程中显示乱码. Log文件中也显示乱码.(Log文件也为UTF8格式)

分析:
1. 是否字符串封送问题。

 c++ api
SSKJ_API const char* SSKJ_GetAudioDevice(void* player, int* deviceLen);
 c# api
[DllImport("VideoEngine")]
private static extern IntPtr SSKJ_GetAudioDevice(IntPtr player, out int strLen);

这里使用DllImport默认参数,  可以使用 [DllImport("VideoEngine"), CharSet = CharSet.Ansi] 等根据需求而定.

返回 的字符串也可使用特性约束. 
[return: MarshalAsAttribute(UnmanagedType.LPStr)] // 约束返回字符串  

2. 是否接收转换方式不对。

// strPtr 为非托管c++dll里字符串的地址,c#需要转换成托管内存。
byte[] buffer = new byte[strLen];
Marshal.Copy(strPtr, buffer, 0, strLen);

// c++,c#文件都是utf8, c++传输用多字节, 需要用gb2312(页码936)接收,再转换成utf8(页码65001)写入文件. 
//Encoding.ASCII为US-ASCII(页码20127)不能接受中文,会转换???
try
{
    // 需要unity播放器中有I18N.dll系列,否则不支持GetEncoding("gb2312")。
    // buffer 和 utf8 长度不一样
    byte[] utf8 = Encoding.Convert(Encoding.GetEncoding("gb2312"), Encoding.UTF8, buffer);
    str = Encoding.UTF8.GetString(utf8);
}
catch (System.Exception arg)
{
    Log.Info("System.Exception", arg.Message);
    throw;
}





【原创】解决untiy使用c++dll过程中, 字符串乱码的问题.

标签:api   try   throw   需求   地址   参数   中文   man   except   

原文地址:http://www.cnblogs.com/zhiGamer/p/6097057.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!