Swift特立獨行的Emoji字數算法

閱讀時間約 4 分鐘
Emoji字數大學問?整死我了

Emoji字數大學問?整死我了

字數算法 = string.count?

在swift算一個string的字數時候,很直覺的會想到用.count來算

let s = "這是幾個字呢".count
print(s.count) // 6

毫無疑問的安心信賴6個字

表情符號的場合

let emoji = "😂"
print(emoji.count) // 1​

一個表情符號=1個字,乍看也是理所當然的,因為真的就出現一個字啊。

但在驗收時卻被QA開單,iOS的字數算法跟Android、Web不一樣。

於是把表情符號貼到google翻譯測試,發現神奇的事

2個字????

2個字????

Google算他是兩個字?!不死心再測試其他表符

🙏 swift = 1個字,google = 2個字

let emoji = "🙏"
print(emoji.count) // 1​
2個字

2個字

🙏🏾 swift = 1個字,google = 4個字

let emoji = "🙏🏾"
print(emoji.count) // 1​
4個字

4個字

👩‍👩‍👧‍👦 swift = 1個字,google = 11個字

let emoji = "👩‍👩‍👧‍👦"
print(emoji.count) // 1​
11個字

11個字

到底是幾個字????🤯

到底是幾個字????🤯

到底算幾個字

看上面的測試也很難做出一個總結,一般版emoji的算2個字,色違版的4個字。但家庭的emoji會算成11個字。然後swift全部算1個字又是怎麼回事?

馬上去查官方文件

Measuring the Length of a String

When you need to know the length of a string, you must first consider what you’ll use the length for. Are you measuring the number of characters that will be displayed on the screen, or are you measuring the amount of storage needed for the string in a particular encoding? A single string can have greatly differing lengths when measured by its different views.

一看完當頭棒喝🤯🤯🤯。官方表示你要算字數的時候,你必須知道自己要的是什麼。是要算螢幕上出現的字數呢?還是特定編碼下的字數?不同情境下算出的字數也會不同。

裡面舉了一個旗子emoji的範例

let flag = "🇵🇷"
print(flag.count)
// Prints "1"
print(flag.unicodeScalars.count)
// Prints "2"
print(flag.utf16.count)
// Prints "4"
print(flag.utf8.count)
// Prints "8"

所以count指的是螢幕上出現的字數,也就是一個字。

這邊我應該是要用的是UTF-16的算法,因為Android(java)跟Web(js)default都是UTF-16編碼。

馬上回去Playground測試

🙏 swift utf16 = 2個字

let emoji = "🙏"
print(emoji.utf16.count) // 2

🙏🏾 swift utf16 = 4個字

let emoji = "🙏🏾"
print(emoji.utf16.count) // 4

👩‍👩‍👧‍👦 swift utf16 = 11個字

let emoji = "👩‍👩‍👧‍👦"
print(emoji.utf16.count) // 1​1

完全吻合🥳🥳🥳

另外StackOverflow上有教另一種轉成NSString.length的算法,其實也是同理,背後是UTF-16

length

The number of UTF-16 code units in the receiver.

let emoji = "🙏🏾"
print(emoji as NSString).length) // 4
print(emoji.utf16.count) // 4


至於更多為什麼emoji會有那麼多不同長度,可以看這位dcard大大的文章,解釋的很詳細🎉



6會員
35內容數
紀錄iOS開發上遇到的問題或是一些流程筆記。主要都是Swift。
留言0
查看全部
發表第一個留言支持創作者!
Michelle Chen的沙龍 的其他內容
Xcode15的 @escaping closure裡解包後的[weak self]不必再寫 self了!! 用一個範例class Test來實驗,裡面只有一個變數a跟一個testClosure回"test",再用callTestClosure把變數a改成"test" 編譯正常!變數a成功被改成
一樣先來看官方文件 A view controller that provides access to documents or destinations outside your app’s sandbox. 其實就是讓你去讀取檔案App的東西 有兩種模式,Don’t copy the do
iCloud+的服務 只有付錢的人才能用,免費仔如我從來沒聽過😗 簡介 通常你在瀏覽網頁時,網路供應商和你所造訪的網站可以看到網頁流量所包含的資訊(例如 DNS 記錄和 IP 位址)。此資訊可用來判斷你的身分,並建立描述檔來記錄你的位置以及往後的瀏覽記錄。 「iCloud 私密轉送」的設計旨
漸層文字 做出像Apple Keynote主題一樣的美美漸層文字 先畫出一大塊美美漸層色,可以選自己喜歡的顏色跟角度去做喔 LinearGradient(colors: [.blue, .purple, .red], startPoint: .bottomLead
先來看官方文件 https://developer.apple.com/documentation/swiftui/spacer Spacer A flexible space that expands along the major axis of its containing stack
其實16也會ㄏㄏ 相關討論: https://developer.apple.com/forums/thread/703145 重現步驟: 在iOS15以上,使用UIActivityViewController執行下列步驟會crash 1. 開啟UIActivityViewControlle
Xcode15的 @escaping closure裡解包後的[weak self]不必再寫 self了!! 用一個範例class Test來實驗,裡面只有一個變數a跟一個testClosure回"test",再用callTestClosure把變數a改成"test" 編譯正常!變數a成功被改成
一樣先來看官方文件 A view controller that provides access to documents or destinations outside your app’s sandbox. 其實就是讓你去讀取檔案App的東西 有兩種模式,Don’t copy the do
iCloud+的服務 只有付錢的人才能用,免費仔如我從來沒聽過😗 簡介 通常你在瀏覽網頁時,網路供應商和你所造訪的網站可以看到網頁流量所包含的資訊(例如 DNS 記錄和 IP 位址)。此資訊可用來判斷你的身分,並建立描述檔來記錄你的位置以及往後的瀏覽記錄。 「iCloud 私密轉送」的設計旨
漸層文字 做出像Apple Keynote主題一樣的美美漸層文字 先畫出一大塊美美漸層色,可以選自己喜歡的顏色跟角度去做喔 LinearGradient(colors: [.blue, .purple, .red], startPoint: .bottomLead
先來看官方文件 https://developer.apple.com/documentation/swiftui/spacer Spacer A flexible space that expands along the major axis of its containing stack
其實16也會ㄏㄏ 相關討論: https://developer.apple.com/forums/thread/703145 重現步驟: 在iOS15以上,使用UIActivityViewController執行下列步驟會crash 1. 開啟UIActivityViewControlle
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
本文介紹了 Swift 語言中的各種數學運算子,包括基本數學運算子、複合賦值運算子、比較運算子、邏輯運算子和範圍運算子。將提供使用這些運算子的方式及其優先順序規則,讓讀者能輕鬆理解如何在程序中實現數值與邏輯運算,並掌握 Swift 中的運算子使用技巧。
本文章介紹 Swift 語言中變數的建立方法,包括變數與常數的宣告、型別推斷、型別註記以及常見資料型別。本文詳細說明瞭可選型別的意義、變數命名的規則和作用域的概念,幫助讀者更有效地使用 Swift 語言進行程式設計。
使用者回報的超級奇怪線上問題,用數字鍵盤(NumberPad)更改欄位時,送出後尾數都會消失。例如:30 ⭢ 3,52 ⭢ 5。 尋尋覓覓了兩天終於被我找到這篇,apple的奇葩的bug 重現條件 iOS17 手機設定是繁體中文語系 前一個用過的鍵盤是Cangjie倉頡 or Suchen
Emergency lockout solutions provide critical assistance when you find yourself locked out of your home, car, or office. These services are designed to
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
She is the best thing that's ever been mine / 她是世界上最美好的存在,也是我一生的摯愛
Thumbnail
That we were never really meant to be / 看吧,我們本就不該選擇彼此
Thumbnail
But if it's okay with you, it's okay with me / 但若你早已沒什麼好說的,那也就這樣吧
三元條件運算子(Ternary Conditional Operator)是一種簡潔的寫法,用於在滿足條件時返回一個值,否則返回另一個值。 基本語法 其中,condition是要測試的條件,如果為true,則返回valueIfTrue,否則返回valueIfFalse。
Thumbnail
10月21日午夜,美國歌手Taylor Swift發布其全新錄音室專輯《Midnights》。此張專輯自宣布到發行過程不斷引發大量話題,在發行當下更不斷打破各項紀錄。作品以獨立流行為底,「失眠的13個夜晚」為概念,融合過往音樂風格和特色,打造出別具特色的低迴氛圍,著實是2022年底音樂界的一部佳作。
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
本文介紹了 Swift 語言中的各種數學運算子,包括基本數學運算子、複合賦值運算子、比較運算子、邏輯運算子和範圍運算子。將提供使用這些運算子的方式及其優先順序規則,讓讀者能輕鬆理解如何在程序中實現數值與邏輯運算,並掌握 Swift 中的運算子使用技巧。
本文章介紹 Swift 語言中變數的建立方法,包括變數與常數的宣告、型別推斷、型別註記以及常見資料型別。本文詳細說明瞭可選型別的意義、變數命名的規則和作用域的概念,幫助讀者更有效地使用 Swift 語言進行程式設計。
使用者回報的超級奇怪線上問題,用數字鍵盤(NumberPad)更改欄位時,送出後尾數都會消失。例如:30 ⭢ 3,52 ⭢ 5。 尋尋覓覓了兩天終於被我找到這篇,apple的奇葩的bug 重現條件 iOS17 手機設定是繁體中文語系 前一個用過的鍵盤是Cangjie倉頡 or Suchen
Emergency lockout solutions provide critical assistance when you find yourself locked out of your home, car, or office. These services are designed to
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
She is the best thing that's ever been mine / 她是世界上最美好的存在,也是我一生的摯愛
Thumbnail
That we were never really meant to be / 看吧,我們本就不該選擇彼此
Thumbnail
But if it's okay with you, it's okay with me / 但若你早已沒什麼好說的,那也就這樣吧
三元條件運算子(Ternary Conditional Operator)是一種簡潔的寫法,用於在滿足條件時返回一個值,否則返回另一個值。 基本語法 其中,condition是要測試的條件,如果為true,則返回valueIfTrue,否則返回valueIfFalse。
Thumbnail
10月21日午夜,美國歌手Taylor Swift發布其全新錄音室專輯《Midnights》。此張專輯自宣布到發行過程不斷引發大量話題,在發行當下更不斷打破各項紀錄。作品以獨立流行為底,「失眠的13個夜晚」為概念,融合過往音樂風格和特色,打造出別具特色的低迴氛圍,著實是2022年底音樂界的一部佳作。