一、土耳其语系的字母大小写的特殊映射(典型的是字母I和i)
1.1、问题的表现
在推广的过程中,突然监控到一个莫名的报错,报错内容如下:
java.lang.Exception
java.lang.Exception - LuaException : cannot open LuaInitFiles: No such file or directory no file './LuaInitFiles.lua' no file '/usr/local/share/luajit-2.1.0-beta3/LuaInitFiles.lua' no file '/usr/local/share/lua/5.1/LuaInitFiles.lua' no file '/usr/local/share/lua/5.1/LuaInit
一开始以为是热更新框架的问题,导致文件丢失。但是却没有监控到其他任何资源加载的错误。
在大量排查各种因素后,发现了规律:触发问题的玩家大多是土耳其语系(其他少量阿塞拜疆语等)。于是乎,把手机语言和地区切换为土耳其,问题复现。
1.2、问题的原因
这里涉及到语言知识,查大模型得知:
土耳其语里大写的I和小写的i在书写和发音上都有明显的不同。
在土耳其语中,小写的“i”是一个元音字母,发音为/i/,其发音类似于英语中的“ee”音。而大写的“I”是一个辅音字母,发音为/ı/,这个音在英语中没有对应的发音,可以尝试发成短而轻的/ɯ/音。
土耳其语字母表中的大写和小写形式有一些独特的映射规则,因此在比较或识别时需要注意它们之间的区别。
因此,是因为热更新框架把AB包打成纯小写的,lua脚本名称的字母大小写映射导致lua直接找不到对应文件了。但基于此原理,即便加载成功,涉及字符串的部分,都可能会有类似的问题。
1.3、解决方案
检测大小写映射,设置为英文环境。
if (CultureInfo.CurrentCulture.CompareInfo.Compare("i", "I", CompareOptions.IgnoreCase) != 0)
{
CultureInfo.CurrentCulture = new CultureInfo("en-US");
}
二、法语等语言的数字小数点
2.1、问题的表现
有一次发现一部分玩家的很多数值变成0了。经过排查,也有一定的区域分布,主要几种在法国、德国等欧洲国家。
复现的方式依然是把手机语言和地区切换为法语,问题复现。
2.2、问题的原因
法语等语言的数字小数点是逗号,而不是英文的点。因此,如果在代码中数字经过了字符串和Parse的转换,就会出现问题。
2.3、解决方案
在字符串转换为数字的时候,使用CultureInfo.InvariantCulture。
Single.TryParse(str, NumberStyles.Float, CultureInfo.InvariantCulture, out result)
三、时区问题
3.1、问题的表现
玩家登录过程中有信息为玩家的时区,有部分玩家登录协议解析失败导致无法进入游戏。
3.2、问题的原因
经过排查,发现是时区的问题。时区有正有负,但是如果协议定义的数据类型为byte,ushort, uint等,就会出现解析失败的问题。
3.3、解决方案
协议定义的数据类型为带符号的sbyte, short, int等。