【研發日記五】解密社交系統ThinkSNS+如何計算字元顯示長度!
今天我們來聊一下可能很多人都會頭疼的東西:顯示長度。
需求是這樣的,在字元的顯示上,兩個英文單詞才佔一箇中文或者其他語言的顯示長度。如下:
上面排的是兩個英文字母,一個漢字,一個Emoji。你會發現,在顯示上佔的寬度是一致的。一些設計上為了好看也要求有這樣的處理。
例如,我們的使用者名稱需求是最多12個非單位元組字元或者24個單位元組字元的需求也可以混合排的需求,我們寫後端不得不處理這樣的驗證了。
需求規則是 /^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/
在ThinkSNS+中,為了能把這部分驗證公用,所以選擇使用自定義驗證規則。我們先說下計算的實現思路吧!
首先,就算是mb_strlen也沒法準確的獲取多位元組字元和單子節字元混合在一起的長度,網上有個說法,漢字佔三個位元組,英文陣列半形符號佔一個位元組,所以:
用這個方法可以得到單位元組佔0.5多位元組佔1的計算。但是以中文為例,只有兩萬個漢字才是這種情況,還有六萬多漢字是四個,其次,emoji也是四個位元組。根本無法準確的計算。
好在在無意間發現一個奇怪的東西str_word_count 這個函式計算非英文單詞外是除了符號例如中文就是按照漢字個數算的,emoji也是同理。
發現這個以後,我們們就好辦了。我們吧使用者名稱中的 [a-aA-Z0-9_] 剔除掉,單獨計算不就是我們要的驗證長度了嗎?
所以,首先我們用:
方式單獨計算出單位元組字元的顯示長度,再用:
方式計算出多位元組的長度,最後:
就得出了顯示長度,實現了,最後封裝成驗證規則:
程式碼是原型程式碼,還沒有進行最佳化,之後我們只要按照下面的方式用:
現在就很好的解決了這個需求。
我們很樂意,將基於 Laravel 的 ThinkSNS+ 產品開發中的技術解決方案分享給大家,也希望喜歡的朋友能給國內開源產品一點點的支援。
【開原始碼倉庫】
GitHub:(點選star,每日關注開發動態。)
ThinkSNS官網:
開源不易,為了爭取開源,我們團隊做了很多努力。把基於Laravel的作品展示在大家面前,之後專欄會持續不斷的分享ThinkSNS +開發過程中的技術細節。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31448874/viewspace-2139997/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 社交 App 系統 ThinkSNS+ PHP 開發概述APPPHP
- 社交系統ThinkSNS+第4階段IOS端研發更新發布播報iOS
- 社交系統ThinkSNS+技術概要
- 社交系統 ThinkSNS+ 技術概要
- 社交系統ThinkSNS+ 效能簡述
- 社交系統 ThinkSNS+ 3.0 更新播報
- 社交系統ThinkSNS+安裝部署演示
- 社交系統ThinkSNS+ V1.9.1更新播報
- 直播系統開發,實現在進度條中顯示文字顯示進度
- 基於 Laravel 的 ThinkSNS+ alpha.2 版本釋出【研發日記六】Laravel
- 計算返回單、雙位元組字元混合字串長度字元字串
- 社交系統 ThinkSNS+ V2.2-V2.3 版本升級指南
- Mac OS系統如何把我的電腦計算機圖示顯示在桌面上Mac計算機
- win10系統桌面時間如何顯示年月日_win10系統桌面時間顯示年月日的方法Win10
- windows store app 如何計算字元所佔的寬度WindowsAPP字元
- win10怎麼開啟cpu溫度顯示 win10系統顯示cpu溫度如何設定Win10
- 開源社交系統ThinkSNS+ V2.2-V2.3升級指南
- Android6.0 顯示系統(五) SurfaceFlinger服務Android
- HTML特殊字元顯示HTML字元
- Win10系統怎麼在工作管理員顯示顯示卡溫度Win10
- c語言的strlen函式計算字元陣列長度不對C語言函式字元陣列
- 開源社交系統ThinkSNS+和ThinkSNS V4有什麼區別
- Android 12(S) 圖形顯示系統 - createSurface的流程(五)Android
- INTO社交算力挖礦系統搭建開發技術
- C語言如何計算陣列的長度C語言陣列
- 筆記本win10系統外接顯示器模糊如何解決筆記Win10
- win10系統長日期格式顯示怎麼設定 win10系統設定長時間格式顯示的步驟Win10
- Linux EXT4檔案系統TF卡空間容量顯示和計算Linux
- opencv計算曲線長度OpenCV
- Lua Table 長度的計算
- 字元陣列的長度字元陣列
- win10記憶體顯示異常怎麼回事 win10系統記憶體顯示異常如何修復Win10記憶體
- 直播app系統原始碼,固定速度的進度條顯示APP原始碼
- 《智慧計算系統》第五章 程式設計框架原理(上)課程筆記程式設計框架筆記
- 研究顯示女性只在乎“弟弟”粗度而非長度
- win10系統下19寸顯示器最佳解析度如何設定Win10
- Android系統耳機圖示顯示Android
- css記錄1:文字塊內超長只顯示一行,且超過寬度顯示為省略號CSS
- golang 計算最長不重複字串長度Golang字串