Unity中外观完全一致的两个字符串判定为不相等的问题求助
C#字符串比对不一致问题排查方案
- 大小写混淆问题:部分字体下大小写字符视觉差异极小,比如首字母大写的
Primary和全小写的primary很难通过日志肉眼区分,可先通过忽略大小写的比对验证:使用string.Equals(ItemSubType, "primary", StringComparison.OrdinalIgnoreCase)做测试,如果比对通过则说明存在大小写不匹配的问题。 - 隐藏不可见字符问题:除普通空格外,零宽空格、全角空格、换行/制表符等特殊字符都不会在日志中显示,你可以通过打印字符串长度快速校验:
Debug.Log("标准primary长度:" + "primary".Length + ",变量ItemSubType长度:" + ItemSubType.Length),如果两者长度不一致即可判定存在隐藏字符,再遍历变量的每个字符打印对应的ASCII码即可定位异常字符。 - Unity序列化覆盖问题:
public修饰的字符串字段会被Unity序列化,Inspector面板中设置的字段值优先级高于代码动态赋值,很可能其他脚本赋值完成后,Unity的序列化机制又将字段值覆盖为Inspector中的旧值。可直接检查挂载对象的Inspector面板对应字段值,或是将字段改为[SerializeField] private修饰避免意外赋值。 - 比较规则差异问题:C#默认的
==字符串比较会受当前运行环境的文化设置影响,可能出现视觉上相同但判定不相等的情况,推荐使用无文化依赖的序号比对规则:string.Equals(ItemSubType, "primary", StringComparison.Ordinal),该规则会逐字节对比字符串内容,不会出现规则类判定偏差。
排查参考代码:
// 长度校验 Debug.Log("primary标准长度:" + "primary".Length); Debug.Log("ItemSubType实际长度:" + ItemSubType.Length); // 逐字符打印ASCII码定位异常 for (int i = 0; i < ItemSubType.Length; i++) { Debug.Log($"第{i}位字符:{ItemSubType[i]},ASCII码:{(int)ItemSubType[i]}"); } // 推荐使用的比较写法 if (!string.Equals(ItemSubType, "primary", StringComparison.Ordinal)) { Debug.Log("字符串确实不相等"); }
内容的提问来源于stack exchange,提问作者DBBQuest
相关产品推荐
相关产品推荐

