首页 > 解决方案 > C# Trim() 在我的一个项目中不起作用

问题描述

我对 Asp.Net 项目有一个愚蠢的问题,我正在研究它超过 5 年。今天突然 Trim() 函数停止工作。

在此处输入图像描述

笔记:

任何想法?

这是代码

    string val = "abo    ‎"; // "abo\x0020\x0020\x0020\x0020\x200e"
    string userName = val.Trim();

您可以在此链接中运行问题

更新: 感谢大家的评论,我还发现了一个简单的检查来测试字符的结尾,当您将光标设置在末尾并按退格键一次没有任何反应时,第二次按开始删除,因为 \x200e字符在最后。

知道如何从左右修剪隐藏的 Char 并像空格一样处理。

标签: c#asp.net

解决方案


String.Trim作品。如果不是这样,成千上万的开发人员会在 16 年前注意到这一点。

字符串以格式化字符结尾,特别\x200eLeft-to-Right-Mark。那绝对不是空格。调用Char.GetUnicodeCategory('‎')返回Format。我怀疑输入来自混合的阿拉伯文和拉丁文文本,也许是用户从更长的字符串中复制的内容?

处理此问题的一种方法是使用String.Trim(char[])指定 LTR 标记以及其他字符。这并不完全一样String.Trim(),它删除了任何使用Char.IsWhiteSpace()返回 true 的字符:

var userName=val.Trim(' ','\t','\r','\n','\u200e`);

另一种选择是使用正则表达式来修剪\sFormat Unicode 类别中的空格和字符Cf,仅从开始^[\p{Cf}\s]或结束([\p{Cf}\s]+$)

string userName = Regex.Replace(val,@"(^[\p{Cf}\s]+)|([\p{Cf}\s]+$)","");

也许更好的选择是使用输入验证来防止意外字符,并要求输入 TextBox 仅包含字母或字母和数字字符。毕竟,用户可以粘贴一些其他意想不到的不可打印字符。警告用户比尝试处理所有可能的不良数据要好。

用户名通常是不带空格的字母和数字组合。所有 ASP.NET 堆栈都允许验证。现代浏览器允许直接在输入元素中进行正则表达式验证,因此我们可以想出一个只允许有效字符的正则表达式,例如:

<input type="text" required pattern="[A-Z0-9]' ..../>

NumberLetter 块 (Nl) 可用于捕获任何语言的数字和字母,就像 Cf 用于捕获格式字符一样


推荐阅读