0
点赞
收藏
分享

微信扫一扫

粘贴而来的文本中在程序执行过程中出现一部分乱码?的问题


最近遇到了一个很难找的乱码问题。

  1. 前端html页面,用户将某些内容粘贴到form表单的框中,然后传到后端。后端再进行其他业务,业务方就提示有非法字符。注意编码的问题不要纠结了,前后端及传输,都是utf-8的。因此排除一个因素
  2. 然后对程序做了一点改动,数据刚刚从前端传到后端,后端立马就写入txt文本,文本中就可以看到问号乱码。但是明明白白可以看到,这段文本就是简单的几个汉字,​​/^\S{2,20}$/.test("xxx")​​这样的验证也可以通过,但就是乱码,真是要疯了,怎么办??
  3. 后来想到一个办法,把这段文字粘贴到专业工具里检测一下,然后就发现了问题。

​​字符检测网页​​

字符:南京相‮劳博‬务服务有‮公限‬司

我就把那段文字粘贴出来放在这里了,不知道如果你从网页中再粘贴出去还有没有这个情况(即某些信息有没有丢失)

上图如下:

粘贴而来的文本中在程序执行过程中出现一部分乱码?的问题_202c


明显可见,里面是有一些奇怪字符的,而且是不可见字符。即 ​​‮​​ 那么,这个字符究竟是什么呢?

查到了一些,还是有说法的,比如这个:
​​​unicode ‮​​

然后一切都明白了。

解决办法:

由于这个问题是文本不知是用户从哪里粘贴来的,然后混有这种奇怪的内容。
如果要避免这个问题,用键盘一个字一个字输入进去就好了,就没有这样的奇怪字符混杂了。

这个问题要不是遇到,真是永远也不会想到还有这回事的。特此记录一下。

补充:

这个网站很强大,可以看看。

​​Unicode 字符百科​​

粘贴而来的文本中在程序执行过程中出现一部分乱码?的问题_202c_02


显然,‮ 这样的是 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
}
}
}


举报

相关推荐

0 条评论