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

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;
}





转载于:https://my.oschina.net/zhenzhi868/blog/495373

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值