Unity中TextMeshPro输入框Trim后长度仍为1的问题求助
解决TextMeshProUGUI输入框清空后仍有不可见字符的问题
问题分析
常规的Trim()方法仅能清除空格、换行、制表符等常见空白字符,但你遇到的不可见字符大概率是Unicode特殊空白/控制字符(比如零宽空格U+200B、非断空格U+00A0),这类字符不在Trim()的默认处理范围内,所以调用后仍会残留。
排查步骤
先定位具体是哪种字符,在代码里添加Debug输出字符的Unicode编码:
public class MainMenuController : MonoBehaviour { public TextMeshProUGUI codeInput; private void Start() { string rawText = codeInput.text; Debug.Log($"原始文本长度:{rawText.Length}"); if (rawText.Length > 0) { // 输出第一个字符的Unicode编码,方便定位问题 Debug.Log($"字符编码:{(int)rawText[0]}"); } string trimmedText = rawText.Trim(); Debug.Log($"Trim后长度:{trimmedText.Length}"); } }
根据输出的编码对应字符:比如8203对应零宽空格U+200B,160对应非断空格U+00A0。
解决方案
1. 针对性清除特定字符
如果已经确定是某类特殊字符,直接用Replace()清除:
private void Start() { // 示例:清除零宽空格+常规Trim string cleanedText = codeInput.text.Replace("\u200B", "").Trim(); Debug.Log(cleanedText.Length); }
如果是多种特殊字符,可叠加Replace():
string cleanedText = codeInput.text.Replace("\u200B", "") .Replace("\u00A0", "") .Trim();
2. 正则表达式过滤所有控制/不可见字符
若不确定具体字符,用正则过滤所有Unicode控制字符和不可见空白:
using System.Text.RegularExpressions; public class MainMenuController : MonoBehaviour { public TextMeshProUGUI codeInput; private void Start() { // \p{C}匹配所有Unicode控制字符(包括不可见空白) string cleanedText = Regex.Replace(codeInput.text, @"\p{C}+", "").Trim(); Debug.Log(cleanedText.Length); } }
3. 检查输入框Inspector设置
- 直接在Inspector的Text字段选中内容,按Delete彻底清空,避免残留不可见字符;
- 排查是否有其他脚本在
Start()/Awake()阶段修改了输入框的text属性; - 检查Text Input Settings里的默认配置,确认没有自动填充特殊字符。
内容的提问来源于stack exchange,提问作者Axiyom
相关产品推荐
相关产品推荐

