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

【原创】解决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;
}



来自为知笔记(Wiz)


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