首页 > 代码库 > 【原创】解决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过程中, 字符串乱码的问题.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。