最近遇到了一个很难找的乱码问题。
- 前端html页面,用户将某些内容粘贴到form表单的框中,然后传到后端。后端再进行其他业务,业务方就提示有非法字符。注意编码的问题不要纠结了,前后端及传输,都是utf-8的。因此排除一个因素
- 然后对程序做了一点改动,数据刚刚从前端传到后端,后端立马就写入txt文本,文本中就可以看到问号乱码。但是明明白白可以看到,这段文本就是简单的几个汉字,
/^\S{2,20}$/.test("xxx")
这样的验证也可以通过,但就是乱码,真是要疯了,怎么办?? - 后来想到一个办法,把这段文字粘贴到专业工具里检测一下,然后就发现了问题。
字符检测网页
字符:南京相劳博务服务有公限司
我就把那段文字粘贴出来放在这里了,不知道如果你从网页中再粘贴出去还有没有这个情况(即某些信息有没有丢失)
上图如下:
明显可见,里面是有一些奇怪字符的,而且是不可见字符。即 ‮
那么,这个字符究竟是什么呢?
查到了一些,还是有说法的,比如这个:
unicode ‮;
然后一切都明白了。
解决办法:
由于这个问题是文本不知是用户从哪里粘贴来的,然后混有这种奇怪的内容。
如果要避免这个问题,用键盘一个字一个字输入进去就好了,就没有这样的奇怪字符混杂了。
这个问题要不是遇到,真是永远也不会想到还有这回事的。特此记录一下。
补充:
这个网站很强大,可以看看。
Unicode 字符百科
显然, 这样的是 html 字符表示,而不是unicode。
再补充
那么,如果我想要写一个正则表达式,让含有这样字符串的填写内容不符合规则,怎么办呢?
那么,这个问题就变成了 如何在正则表达式某字符集合中排除某些字符?
这个问题还是不太常见的,网上多的是排除某个或某几个字符的。
关键知识点: 零宽断言。
真没想到有朝一日我能在工作中用到零宽断言。
直接上一段C#的代码吧,其他语言一样了。
using System.Text.RegularExpressions;
namespace gbk
{
class Program
{
static void Main(string[] args)
{
string inputRight = "南京祥博劳务服务有限公司"; //没有此种特殊字符的文本
string inputWrong = "南京相劳博务服务有公限司"; //有此种特殊字符的文本
string patternUnicode = "^((?![\u202E-\u202F])\\S){2,50}$";
Regex regu = new Regex(patternUnicode);
var aa3 = regu.IsMatch(inputRight); //true
var aa4 = regu.IsMatch(inputWrong); //false
}
}
}