C#Trim()在我的一个项目中不起作用

C#Trim()在我的一个项目中不起作用,c#,asp.net,C#,Asp.net,我对Asp.Net项目有一个愚蠢的问题,我已经做了5年多了。 今天,Trim()函数突然停止工作 注: 我将项目框架从4.7.2更新到4.8,但问题仍然存在 我试过TrimLeft()和TrimRight()也有同样的Trim()问题 替换功能仍然工作正常,没有受到影响,但它不是一个好的解决方案,我使用它的每一个地方 在新项目上精打细算 我还检查了空间的字符代码,它是32 有什么想法吗 这是密码 string val = "abo ‎"; // "

我对Asp.Net项目有一个愚蠢的问题,我已经做了5年多了。 今天,Trim()函数突然停止工作

注:

  • 我将项目框架从4.7.2更新到4.8,但问题仍然存在
  • 我试过TrimLeft()和TrimRight()也有同样的Trim()问题
  • 替换功能仍然工作正常,没有受到影响,但它不是一个好的解决方案,我使用它的每一个地方
  • 在新项目上精打细算
  • 我还检查了空间的字符代码,它是32
有什么想法吗

这是密码

    string val = "abo    ‎"; // "abo\x0020\x0020\x0020\x0020\x200e"
    string userName = val.Trim();
您可以在下面的示例中运行该问题

更新: 感谢大家的评论,我还发现了一个简单的检查来测试字符的结尾,当您将光标设置在末尾并按backspace一次什么都没有发生时,第二次按start删除,这是因为末尾有\x200e字符


你知道如何从左边和右边修剪隐藏的字符,并像处理空格一样处理吗。

String.trim
有效。如果不是这样,16年前成千上万的开发者就会注意到

字符串以格式化字符结尾,特别是
\x200e
,即。这绝对不是空白。调用Char.getUnicodeCegory('‎')返回
格式
。我怀疑输入来自阿拉伯语和拉丁语混合文本,可能是用户从较长字符串复制的

处理此问题的一种方法是使用指定LTR标记和其他字符。但这与
String.Trim()
不同,后者会删除任何返回true的字符:

另一种选择是使用一个正则表达式,只从开头
^[\p{Cf}\s]
或结尾
([\p{Cf}\s]+$)修剪空格
\s
和Unicode类别
Cf
格式的字符:

也许更好的选择是使用输入验证防止意外字符,并要求输入文本框仅包含字母或字母和数字字符。毕竟,用户可以粘贴其他意外的不可打印字符。与其尝试处理所有可能的错误数据,不如警告用户

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

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

非常感谢您完整的解释性回答。目前我的用户是从一个flutter移动应用程序注册的。我们将尝试处理这个问题。然后在API中添加验证。黑客喜欢模糊API,甚至不需要编写任何东西,他们只需使用现成的脚本。ASP.NET应用程序也是如此,但仍然会收到大量的请求
/admin.php
。猜猜为什么我有我的验证,而用户不是因为这个问题而创建的,我还将您的解决方案添加到了项目中并更新了我的服务器,非常感谢您为我节省了很多时间。评论不是为了进一步讨论;此对话已经结束。
string userName = Regex.Replace(val,@"(^[\p{Cf}\s]+)|([\p{Cf}\s]+$)","");
<input type="text" required pattern="[A-Z0-9]' ..../>