又碰到一個奇葩的BUG
最近線上發生了一個問題,同事找我說有個使用者名稱字不對,正則驗證不通過。
於是我就去資料庫查詢看了下這個使用者的名字資訊,就長這個樣子。
沒仔細看好像沒啥問題啊,但是認真看了兩遍發現好像不太對,怎麼這個字這麼寬呢?
我靠,這塔喵的是好像是全形啊!
具體原因就是因為插入的名字是全形的,導致其他地方呼叫介面取名字用正則判斷不通過。
修復這個問題很簡單,重新用半形的字型更新一下名字就可以了,另外前端是有校驗的,後端沒有用正則做校驗,需要補上這個校驗邏輯。
但是這個問題就很奇怪,這個全形和半形難道沒有校驗的嗎?
帶著好奇,我特意測試了一下淘寶、騰訊和頭條的註冊,看是不是可以儲存全形。
首先試了下淘寶,紅框中我輸入的是全形的手機號,很明顯全形是不行的。
再試試QQ註冊,發現也是不可以的,這很好,大家都不要全形的。
問題到這裡其實很清晰了,前後端在註冊的時候肯定遺漏了這個校驗的邏輯,補上即可。
我再測試了一下匹配英文的正則:
javascript
var p = /^[A-Za-z0-9]+$/g
p.match('qqq') //輸出true
p.match('qqq') //輸出false
所以建議大家沒有對手機號、名字之類做校驗的可以補上一個正則的校驗,防止落庫的資料是全形,避免坑爹。
這個會引發很多問題,比如如果全形儲存的手機號,調發送手機驗證碼介面,別人校驗的是半形的規則,你傳送驗證碼都該報錯了!
問題都說完了,不妨再瞭解下到底什麼是全形?什麼是半形?
用過輸入法大家肯定都見過,但是具體的區別可能還真不知道。
在GB/T 9851.2-2008《印刷技術術語 第二部分:印前術語》中有對應的解釋:
2.31 全形 em 排字的度量單位,寬度等於所使用的文字的磅數(point),用作排版寬度水平方向的度量。
2.32 半形 en 排字的量度單位,寬度等於同一磅數全形的一半。
大家都知道,我們中文字型都是方塊字,包括排版也是一樣,所以我們的漢字一個字的寬度是一樣的。
但是在英文裡就不一樣了,一個英文字母的寬度可能是不一樣的,所以全形/半形的概念誕生就是為了英文而服務的。
它要表達的意思很簡單,就是代表字型寬度的概念而已。
而實際上,全形/半形這個概念來源於日本,在日文中,角的意思就是正方形,所以全形/半形的含義就是整個正方形/半個正方形的意思。
這個還有很多叫法,比如全身/半身,港臺地區叫全形/半形,但是無論怎樣,這些稱呼都是在印刷行業的裡術語稱呼。
但是後來,隨著計算機的發展,好像咱們科技界的人不太懂這玩意兒,直接把全形/半形搬過來用了,於是就形成了現在我們知道的局面。
我們都知道,最開始的時候為了對映二進位制和英文字母的關係,有了ASCII碼,它只有1個位元組,最多也只能表達256個符號,而且英文也沒用完,只用了128個。
但是對於中文和很多其他語言來說,256個符號肯定是不夠用的,那咋辦呢?那就只能用兩個位元組了。
所以,隨著使用者的使用習慣,逐漸習慣地把全形當成雙位元組的中文、韓文,半形當成英文這樣子。
在計算機發展初期的時候,全形/半形的概念大概就等同於單位元組/雙位元組這樣的含義,另外還有一層含義就是我們上面說過的表示寬度,全形表示佔用排版的寬度是半形的一倍。
當然了,隨著計算的發展,又誕生了GB2312、GBK,Unicode、UTF-8這些編碼,比如GBK中文英文都是兩個位元組,UTF8下文中3個位元組,現在的全形/半形的概念就和佔用儲存空間大小沒有任何關係了。
所以總結下來啊,全形/半形的稱呼來源日文,但是被錯誤的直接帶入了科技界(印刷界的人說我都不知道你們這麼牛逼),最初的時候全形/半形就是代表寬度的含義,也被約定俗成地賦予了雙位元組/單位元組的含義,現在來看它只能使用者描述寬度更為合適一點。
還有啊,做好程式碼的引數校驗,這個落庫了就麻煩了,否則還得跟我一樣去刷一遍資料!
參考資料:
https://zh.wikipedia.org/wiki/%E5%85%A8%E5%BD%A2%E5%92%8C%E5%8D%8A%E5%BD%A2#cite_note-1
https://www.thetype.com/2018/02/14211/
- 往往排查很久的問題,最後發現都非常簡單。。。
- 都在用 AI 生成美少女,而我卻。。。
- 炸了!3年圖片都沒了!
- chatGPT辣麼火,你卻不會註冊
- SpringBoot3正式版將於11月24日釋出:都有哪些新特性?
- NB的Github專案,看到最後一個我驚呆了!
- 10分鐘教你寫一個數據庫
- 程式設計師最容易讀錯的單詞,聽到status我炸了
- 從-1開始實現一箇中間件
- 搭建個人部落格,Docsify Github webhook JGit解決方案
- IDEA 2022全新UI體驗
- Sentinel叢集限流探索
- 又碰到一個奇葩的BUG
- 面試官:你說說限流的原理?
- MySQL最高每秒57萬寫入,帶你裝X,帶你飛!
- 面試八股文
- 一個csdn 大佬
- 你知道CSDN排名第一的人是誰嗎?
- Talk is cheap,show me the code!
- 男人要慢,SQL要快:記一次慢SQL優化