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大大的文章,解釋的很詳細🎉



留言
avatar-img
留言分享你的想法!
avatar-img
Michelle Chen的沙龍
8會員
34內容數
紀錄iOS開發上遇到的問題或是一些流程筆記。主要都是Swift。
Michelle Chen的沙龍的其他內容
2024/09/06
本文介紹了使用KeyboardLayoutGuide的方法,以及在不同iOS版本和設備上遇到的佈局問題。透過調整TextView的底部對齊方式,成功解決了在模擬器和真實設備上出現的錯誤,提供了有用的建議給開發者。本文還探討了為何在iOS15與Xib的組合使用中會出現問題,以及解決方案。
Thumbnail
2024/09/06
本文介紹了使用KeyboardLayoutGuide的方法,以及在不同iOS版本和設備上遇到的佈局問題。透過調整TextView的底部對齊方式,成功解決了在模擬器和真實設備上出現的錯誤,提供了有用的建議給開發者。本文還探討了為何在iOS15與Xib的組合使用中會出現問題,以及解決方案。
Thumbnail
2024/08/07
使用者回報的超級奇怪線上問題,用數字鍵盤(NumberPad)更改欄位時,送出後尾數都會消失。例如:30 ⭢ 3,52 ⭢ 5。 尋尋覓覓了兩天終於被我找到這篇,apple的奇葩的bug 重現條件 iOS17 手機設定是繁體中文語系 前一個用過的鍵盤是Cangjie倉頡 or Suchen
2024/08/07
使用者回報的超級奇怪線上問題,用數字鍵盤(NumberPad)更改欄位時,送出後尾數都會消失。例如:30 ⭢ 3,52 ⭢ 5。 尋尋覓覓了兩天終於被我找到這篇,apple的奇葩的bug 重現條件 iOS17 手機設定是繁體中文語系 前一個用過的鍵盤是Cangjie倉頡 or Suchen
2024/07/03
這篇文章探討瞭如何在iOS應用程式中客製化Alert,包括改變字體大小、內嵌連結以及讓Alert的高度隨著字數增長並提供scroll操作。同時使用SwiftUI進行客製化,並介紹瞭解決高度超出範圍後文字捲動與scrollView固定高度的方法。
Thumbnail
2024/07/03
這篇文章探討瞭如何在iOS應用程式中客製化Alert,包括改變字體大小、內嵌連結以及讓Alert的高度隨著字數增長並提供scroll操作。同時使用SwiftUI進行客製化,並介紹瞭解決高度超出範圍後文字捲動與scrollView固定高度的方法。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
題目敘述 Integer to English Words 給定一個整數num 請轉換成對應的的英文數字表達(One, Two, Three, ... 那種數字表達式)
Thumbnail
題目敘述 Integer to English Words 給定一個整數num 請轉換成對應的的英文數字表達(One, Two, Three, ... 那種數字表達式)
Thumbnail
題目敘述 題目會給定一個猜數字的場景和介面 (包含一個可以呼叫,驗證是否為答案的API guess() function), 要求我們實現猜數字的function guessNumber(int n)。 題目已經事先設定好一個祕密數字,要求我們去找出來那個祕密數字是多少。 就好像小時候
Thumbnail
題目敘述 題目會給定一個猜數字的場景和介面 (包含一個可以呼叫,驗證是否為答案的API guess() function), 要求我們實現猜數字的function guessNumber(int n)。 題目已經事先設定好一個祕密數字,要求我們去找出來那個祕密數字是多少。 就好像小時候
Thumbnail
題目敘述 題目會告訴我們一組英文和數字之間的轉換編碼規則,還有一個輸入字串s,問我總共有多少合法的解碼方式? 要特別留意,輸入字串可能包含有leading zero,導致無法解碼。 轉換規則如下: A <-> 1 B <-> 2 C <-> 3 ... Z <-> 26 詳細的題
Thumbnail
題目敘述 題目會告訴我們一組英文和數字之間的轉換編碼規則,還有一個輸入字串s,問我總共有多少合法的解碼方式? 要特別留意,輸入字串可能包含有leading zero,導致無法解碼。 轉換規則如下: A <-> 1 B <-> 2 C <-> 3 ... Z <-> 26 詳細的題
Thumbnail
實作密碼產生器 請使用者輸入要產生幾位數的密碼長度 依據使用者輸入的密碼長度,輸出密碼 import random import string 數字 = string.digits 英文 = string.ascii_letters 字母表 = 數字 + 英文 # 0123456789abc
Thumbnail
實作密碼產生器 請使用者輸入要產生幾位數的密碼長度 依據使用者輸入的密碼長度,輸出密碼 import random import string 數字 = string.digits 英文 = string.ascii_letters 字母表 = 數字 + 英文 # 0123456789abc
Thumbnail
索引很好用,但一定要做索引才能解決計數問題嗎?超車對手的機會來了!
Thumbnail
索引很好用,但一定要做索引才能解決計數問題嗎?超車對手的機會來了!
Thumbnail
字數算法 = string.count? 在swift算一個string的字數時候,很直覺的會想到用.count來算 let s = "這是幾個字呢".count print(s.count) // 6 毫無疑問的安心信賴6個字 表情符號的場合 let emoji = "😂" print
Thumbnail
字數算法 = string.count? 在swift算一個string的字數時候,很直覺的會想到用.count來算 let s = "這是幾個字呢".count print(s.count) // 6 毫無疑問的安心信賴6個字 表情符號的場合 let emoji = "😂" print
Thumbnail
題目:完成解決方案,當第一個參數(String 型別)以第二個參數結尾時(也是 String 型別)返回 true。
Thumbnail
題目:完成解決方案,當第一個參數(String 型別)以第二個參數結尾時(也是 String 型別)返回 true。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News