// 文件: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中了,也就不会出现乱码的现象。