Unity中Text游戏对象字符串在switch case中匹配失败如何解决
Unity字符串Switch匹配失败解决方案
问题根因
匹配失败基本是由字符串中的不可见字符导致的,常见的包括首尾空格、换行符、制表符、零宽空格,还有可能是撇号被自动转换为了智能全角撇号’,和你手写的半角撇号'不匹配。
处理方案
第一步:字符串标准化清洗
在进入switch判断前,先对answer.text做统一清洗处理,代码如下:
// 字符串清洗逻辑 string cleanedAnswer = answer.text .Trim() // 移除首尾常规空白(空格、换行、制表符) .Trim('\u200B', '\uFEFF', '\u202E') // 移除常见不可见特殊字符:零宽空格、BOM头、反向控制符 .Replace('’', '\'') // 将智能全角撇号统一替换为标准半角撇号 .ToLowerInvariant(); // 若无需区分大小写可保留此行,否则删除 switch (cleanedAnswer) { case "it's a potato": points++; break; // 其他答案的case逻辑 }
第二步:异常排查方法
如果清洗后还是匹配失败,可以通过字符级比对快速定位差异:
string standardStr = "it's a potato"; string rawAnswer = answer.text; // 先比对长度,长度不一致肯定有隐藏字符 Debug.Log($"标准字符串长度:{standardStr.Length},实际字符串长度:{rawAnswer.Length}"); // 逐字符输出ASCII码对比 for (int i = 0; i < Mathf.Max(standardStr.Length, rawAnswer.Length); i++) { char sChar = i < standardStr.Length ? standardStr[i] : ' '; char rChar = i < rawAnswer.Length ? rawAnswer[i] : ' '; Debug.Log($"索引{i}:标准字符【{sChar}】ASCII={(int)sChar},实际字符【{rChar}】ASCII={(int)rChar}"); }
输出后对比每个位置的ASCII码,就能直接找到差异字符,针对性加替换逻辑即可。
内容的提问来源于stack exchange,提问作者adrian
相关产品推荐
相关产品推荐

