c# - C# Trim() 在我的一个项目中不起作用
问题描述
我对 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();
您可以在此链接中运行问题
更新: 感谢大家的评论,我还发现了一个简单的检查来测试字符的结尾,当您将光标设置在末尾并按退格键一次没有任何反应时,第二次按开始删除,因为 \x200e字符在最后。
知道如何从左右修剪隐藏的 Char 并像空格一样处理。
解决方案
String.Trim
作品。如果不是这样,成千上万的开发人员会在 16 年前注意到这一点。
字符串以格式化字符结尾,特别\x200e
是Left-to-Right-Mark。那绝对不是空格。调用Char.GetUnicodeCategory('')
返回Format
。我怀疑输入来自混合的阿拉伯文和拉丁文文本,也许是用户从更长的字符串中复制的内容?
处理此问题的一种方法是使用String.Trim(char[])指定 LTR 标记以及其他字符。这并不完全一样String.Trim()
,它删除了任何使用Char.IsWhiteSpace()返回 true 的字符:
var userName=val.Trim(' ','\t','\r','\n','\u200e`);
另一种选择是使用正则表达式来修剪\s
Format 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 用于捕获格式字符一样
推荐阅读
- jquery - 使用 jQuery 计算活动过滤器并将其插入到属性中
- javascript - vue 3 chart.js 数据从 api 更新但图表未呈现
- python - 如何使用参数将整数值获取到带有 Python 连接器的 MySQL 数据库中
- database - “用户 ADMIN 对架构没有权限。” 联系您的应用管理员,使用 oracle apex 18.2 收到此错误
- python - 仅删除特定句号在文本中意外失败
- python - 无法导入“cv2”
- arrays - Ngfor 到数组并通过 ngif 访问
- android - Android read_external_storage 权限请求问题
- node.js - 没有收到 Axios 对前端的任何响应
- elasticsearch - ElasticSearch 搜索空字段