范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

表单input输入框复制粘贴进unicode零宽字符,前端踩坑和解决方案

  Unicode 统一码
  也叫万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。统一码是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
  Unicode 零宽字符
  Unicode字符中有一类特殊的字符叫做零宽字符 ZWJ(zero width joiner),也叫非打印字符、不可见字符。正则的断言即叫零宽断言,意思即本身并不占用宽度,如比较出名的零宽空格ZWSP:U+200B。
  零宽字符本质也是字符,对于计算机来说,它依然会占用空间,在 Unicode 字符集中拥有独立的编码,你在 Word 键入这一字符它仍会被计入字数统计,同样在代码中打印这类字符的长度可以看到也是会占用长度的。
  零宽字符的宽度为 0,对于肉眼而言不可见,在我们常用的一些软件中并不会显示,比如浏览器、Excel...,这些字符通常被用于在阿拉伯文与印度语系等文字中,用于控制字符间是否产生连字的效果,在其他大多数语言中,你并不能直接打出这类字符。
  常见的几种零宽字符有:零宽空格:U+200B 零宽连接符:U+200D,常见的复杂Emoji表情即用到了该字符,用于表示多字符关系从而合成复杂新字符 零宽非连接符:U+200C 零宽非断空格符:U+FEFF 左至右符:U+200E 右至左符:U+200F 蒙古文元音分隔符:U+180E 怎么能看见零宽字符?
  直接复制到开发工具如 vscode 里,是可以直接看到这类字符的 unicode 码的。
  在 windows 记事本中-右键,选择 "显示 Unicode 控制字符",也可以‭看到这类特殊符号。
  navicat 中查看mysql中的数据,也可以像记事本一样右键选择"显示 Unicode 控制字符",光标聚焦的时候也可以看到有特殊符号显示出来。
  还有复制粘贴进网页、记事本、输入框中,移动光标的时候,也可以发现,这类字符也是需要靠光标移动的。 零宽字符的应用场景字符加密解密 数据防爬 隐形水印 缩短网址 敏感词分隔过审 空白评论、空白用户名 输入内容翻转如:花了‮7万5‬千,其中的7万5会被翻转成5万7 零宽字符踩坑
  之所以发现这个问题,也是从客户的一个 excel 模板中粘贴电话号码,最终发现莫名有特殊字符,开始还以为是输入组件的bug。
  数据库是支持这种字符的,所以如果前后端未进行数据过滤,是会被直接存储到数据库中的,正常也是没什么问题。但是如果有搜索功能,用户在应用中直接手动输入检索的时候,因为手动输入是不包含特殊字符的,所以有可能导致匹配不出来,给人的感觉就是:明明看着一毛一样,一个字母一个字母对着敲的,咋就搜不出来呢!
  在前端表单中,如果用户输入时是直接从其他地方如 excel 里复制的,就有可能包含这类看不见的零宽字符,据说从 iphone 手机的通讯录里复制的电话号码粘贴进excel中就有可能包含零宽字符。
  当用户提交时,前端在控制台打印或者network里看提交的接口参数里也是看不到这类字符的,还有如果 input 输入框有限制最大输入长度 max-length,零宽字符也是会占用输入框的长度的。 前端解决方案
  前端解决可以直接在输入或提交表单的时候通过 unicode 码去过滤这类特殊字符,但是每个输入框都要这样去做工作量太大了,而且都是重复性工作,最终想到了用 vue 的全局指令自己封装一个 v-trim 统一去过滤数据,正好项目中用的 elment-ui 的输入框组件 trim 修饰符也有bug,直接一块解决了,后期使用和维护都比较方便。
  directives目录下的 index.js,利用webpack提供的 require.context,自动注册目录下的指令文件,直接将文件名作为指令名: // require.context是webpack提供的api用来创建上下文作用域 // 三个参数分别为:目录、是否搜索子文件夹、匹配文件名的正则 const fileInfo = require.context("./", false, /^./(?!index.js).*.js$/) const fileNameList = fileInfo.keys() || []  export default {   // 插件为对象时,Vue.use()会默认调用install   install: function(Vue) {     fileNameList.forEach(fileName => {       const directive = fileInfo(fileName)       // 提取路径中的文件名作为指令名称       const directiveName = fileName.replace(/^(./)([a-zA-Z0-9-_]+).js$/, "$2")       // 注册指令       Vue.directive(directiveName, directive.default || directive)     })   } }
  directives目录下的 trim.js,去除输入框首尾空格和过滤零宽字符: /**  * 去除输入框首尾空格和过滤零宽字符  * ❶ element-ui 的输入框el-input加了 trim 会导致字符中间不能输入空格(文档上有说:不支持 v-model 修饰符)  * ❷ 需同时过滤掉输入内容里的零宽字符,一般是用户直接从 excel 中直接复制粘贴进来的内容  */  const TRIM = {   inserted: el => {     // 兼容第三方输入组件,如el-input     const inputTag = el.tagName !== "INPUT" ? el.querySelector("input") : el     const handler = function(event) {       const oldVal = event.target.value || ""       // 过滤掉零宽字符和首尾空格       const newVal = oldVal.replace(/[​-‏‪-‮]/g, "").trim()       if (oldVal != newVal) {         event.target.value = newVal         dispatchEvent(inputTag, "input")       }     }     el.inputTag = inputTag     el._blurHandler = handler     inputTag.addEventListener("blur", handler)   },    unbind: el => {     const { inputTag } = el     inputTag.removeEventListener("blur", el._blurHandler)   } }  function dispatchEvent(el, type) {   const evt = document.createEvent("HTMLEvents")   evt.initEvent(type, true, true)   el.dispatchEvent(evt) }  export default TRIM
  在 vue 入口文件 main.js 中注册全局指令:
  Vue.use 本身是一个函数,如果需要注册的插件是一个对象,就需提供 insatll 方法,Vue 会去执行它,同时传递一个Vue构造函数作为第一个参数,以及 use 中的其他参数,不依赖Vue去运行的我们可以直接用 Vue.prototype 去挂载到原型上就行了;需要和 Vue 构造函数进行交互的时候,才使用 Vue.use,如全局组件(像iview、element-ui)、全局过滤器、全局指令这些。import Vue from "vue" import App from "./App" import router from "./router"  // 全局指令 import directives from "@/directives" Vue.use(directives)  new Vue({   el: "#app",   router,   template: "",   components: {     App   }, })
  在vue页面中的输入框中使用:
  参考文档 Unicode 官网 How to use Unicode controls for bidi text Unicode Character Categories 后端过滤隐藏字符(零宽度字符)

蒙特梭利方法的优缺点是什么?蒙特梭利方法的优点对传统教育体系最常见的抱怨之一是它没有教给孩子独立决定。蒙特梭利技术允许孩子按照自己的节奏和节奏独立发展和学习。蒙特梭利学校的老师是观察者,孩子们在没有老师压力的张国立王刚张铁林铁三角再聚首!电视剧老家伙首发预告今日,电视剧老家伙发布了首支预告片。这是张国立王刚张铁林经典铁三角22年来第10次荧屏合作,让网友直呼爷青回!该剧由温德光执导,张国立王刚张铁林领衔主演,周涛王自健张昊唯孙安可等主交社保的人注意了,社保交多少年?才能达到退休金3000元的标准相信朋友们都知道,社保缴纳满十五年后,到一定年龄才可以领退休金,那么大家有没有想过要缴纳多少年的社保,才能达到每月领3000元的退休金标准呢?退休金的标准与多种因素有关,比如定额调细数家族成员间的差别,教你挑选美商海盗船K70系列键盘前几天有个朋友问我我想买一把美商海盗船的K70键盘,可搜了一下发现K70居然有那么多不同的型号!而且价格差别还挺大,你知道那些型号都有什么区别吗?emmmm这个问题就说来话长了。然晚安在教育子女上,你只有一次机会今日推荐阅读在教育子女上,你只有一次机会对于很多父母来说,他们常常面临这一个问题事业成功和教育孩子,到底孰轻孰重?有人说,陪伴是最好的教育,给孩子金山银山,不如给他完整的安全感。有你曾经对妈妈说过的谎,其实她早就识破了(漫画)相信每一个孩子,小时候都曾经对自己的妈妈撒过谎,而且针对这一个问题,还有过相关的采访,54的受访者表示偶尔对妈妈撒谎,31。3的受访者表示很少对妈妈撒谎,11。7的受访者表示经常对冲奶粉时,先放奶还是先放水?很多家长弄错了,当心对娃不好导语冲奶粉时,先放奶还是先放水?很多家长弄错了,当心对娃不好有些宝宝从一出生就要喝奶粉,也有些宝宝断奶后才开始喝奶粉,不管哪种情况,只要开始给宝宝开始喝奶粉了,家长就要弄懂冲奶粉的光伏封装材料行业分析BIPV轻量化及技术变革带动增量需求(报告出品方作者天风证券,鲍荣富,王涛,熊可为)1。光伏封装材料组件质量寿命的关键光伏封装材料处于产业链中游,主要包括光伏玻璃胶膜背板和边框。1)光伏玻璃是直接用于太阳能光伏发电和知名歌手傅松去世,嚼槟榔患上口腔癌,去世前劝网友远离槟榔近日,知名歌手傅松突然传出逝世的消息,他的好友在社交平台上说明了去世的原因,口腔癌。傅松很年轻,今年才三十六岁,很多网友和喜欢他的粉丝都是有点不相信这个消息。他的好友也是和傅松一样曹德旺预言2022年后的信用危机是怎样的危机呢曹德旺先生曾经预言2022年之后会进入信用危机时代,曹德旺说,我认为2022年之后至少要延续到2028年,所以大家还有五六年要等待,只会更久不会缩短。那么这个信用危机第一,是更多的ICE主力合约或破100美分用棉企业需持币待机9月13日,没出意外,ICE棉花期货各合约又大幅下挫,主力在连续上攻110美分磅关口失败后掉头下行,打开105美分磅窗口,低点险些触及9月7日101。19美分磅(盘中低点101。6
个性发带染这个秋天染点不一样的这几季各种形式的挑染十分流行,除了刘海染挂耳染之后,又兴起了一种新的挑染,那就是发带染发带染是因为染出来的效果就像一根发带别在头发上一样,因此就叫发带染彩色发带和其他发色的层次对比唐嫣穿高跟鞋更高挑了,一身不规则白纱裙梦幻甜美,人比风景还美短裙总是充满了阳光活力的感觉,如果想要穿的减龄元气,是非常合适的选择,短裙对于身材的包容性也是很好的,拉高腰线,露出腿部,直接展现出优越的身材比例。浅色系的短裙除了清纯气息浓厚,还高颜值计时码表,3万元左右带回家腕表之家腕表推荐之前有位朋友和我吐槽,现在市面上很多表已经成为了奢侈品,完全脱离了它们最初工具表的属性,但对于普通表迷来说,工具表其实是最适合入手的。而在工具表中,计时码表因其功能读过的书,每一页都算数来源新华社书中发现自己,改变自己。看到过这样一个问题一个人的三观是怎样慢慢变化的?有个回答是三观一开始受父母的影响,接着受同学老师的影响,后来受所处环境的影响,一步一步变得有自己的与秋天拥抱,与快乐同行五星乡各小学秋景美图秋天的五星校园,风轻云淡,丹桂飘香,空气中弥漫着香甜的味道。付灵昱摄在五星乡冯家村小学的校园里,迎来了绚丽多彩的秋季,孩子们与秋天不期而遇。看,那色彩鲜艳的格桑花,那漫天飞舞的金色人生的秋季秋风用时光的旋律,用桂花的芬芳苹果的馨香菊花的灿烂牵牛花的奔放一串红的艳丽,把一望无际的田野乡村,演绎得在自然中沉醉,渲染得天地间空旷而又阳刚。酷热的夏天刚刚过去,秋风吹来,秋牵着人生的意义是什么?头条创作挑战赛人活着到底为了什么,为了谁?今天突然开始思考人生的意义了,闲言碎语,语无伦次,想到哪里说哪里,不敢称此文为文。想着人生的意义何在,我想到了这些,可能意义在于1。珍惜和关于你的人生,值得珍藏的24个哲理1hr世界往往不讲道理,但是,却始终伪装成一副讲道理的样子。情场是讲钱的,但是,也始终伪装成不讲钱的样子,桌面上一副清新脱俗的逼样,桌子底下,算盘打得噼里啪啦作响。公司有一些同事讨爵士人生光荣之路华为mate系列手机简史上个月Mate50系列发布了,销量可谓火爆,首批400万台的备货被一抢而空。后面发布的iPhone14系列相比之下就被抢了不少风头,而且14plus还破发了,也就Pro系列给苹果挽治愈文案1。玫瑰在离开小王子时这样说我当然爱你没有让你感受到,是我的不对安东尼德圣埃克苏佩里小王子2。好好忍耐,不要沮丧。如果春天要来,大地会使它一点点地完成。里尔克3。主动,是因为在乎。美国施压无效,韩三星与SK作出承诺,将努力提供芯片保障中国运营进入新世纪以来,中国开始高速发展,而美国作为霸权主义国家,自然不会坐视中国的崛起,于是在经济文化政治科技等多个领域对中国进行打压,其中在科技上面的打压最为明显。如今全球进入数字化时