解决C# luainterface 中文乱码问题

// 文件:LuaInterface-master\Core\KopiLua\luaconf.cs
// Lua.fread函数
//
public static int fread(CharPtr ptr, int size, int num, Stream stream)
{
    int num_bytes = num * size;
    byte[] bytes = new byte[num_bytes];
    try
    {
        int result = stream.Read(bytes, 0, num_bytes);
        for (int i = 0; i < result; i++)
            ptr[i] = (char)bytes[i]; // ★问题根源在此处
        return result / size;
    }
    catch
    {
        return 0;
    }
}

如果我自己定义的test.lua是GB2312编码方式保存的话,如:

--test.lua

zh_test="中"
print("zh_test")

"中"在GB2312的编码方式下的bytes为:{ 0xD6, 0xD0 },是两个字节,而按Lua.fread函数读取方式,中文字符‘中’将被放在两个bytes中(ptr中也会用两个char来存放中字),导致了字符被拆开了。所以我们要让中文显示出来,就对文件读取方式进行转码解析

public static int fread(CharPtr ptr, int size, int num, Stream stream)
{
    int num_bytes = num * size;
    byte[] bytes = new byte[num_bytes];
    try
    {
        int result = stream.Read(bytes, 0, num_bytes);
        bytes = Encoding.Convert(Encoding.GetEncoding("GB2312"), Encoding.Unicode, bytes, 0, result);
        var chars = Encoding.Unicode.GetChars(bytes);
        for (int i = 0; i < chars.Length; i++)
            ptr[i] = chars[i];
        return chars.Length / size;
    }
    catch
    {
        return 0;
    }
}

GB2312=>Unicode的字节,然后获取Unicode字节的char[],这样一来,'中'字{'0xD0D6'}只会存在一个char中了,也就不会出现乱码的现象。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值