[C#] 關於 emoji 取得 length 問題,關於分別取出 .ToArray() 的問題

2021-10-21


最近因為專案的一些需求,需要用到 Emoji ,這東西在各平台渲染出來的都不一樣,我相信大家都知道這些事情就不多說了,主要是因為遇到一個問題,處理起來讓我意外,再加上混和中文或是英文的時候,就有一點點跟我想的不一樣 舉理來說  "許1d"  這字串,其中你覺的應該有幾個字呢?




我們來 寫 code 測試看看

var emojiStr = "😇許😉1😊d🐨"; OutputResult += emojiStr + "<br>"; //output: 😇許😉1😊d🐨 //長度:11 OutputResult += "長度:" + emojiStr.Length + "<br>";


後來我發現,其實沒有這麼簡單,因為你理解會是七個字,印出來卻是 11 ,至於原因,下面 reference 可以去找詳細原因,這邊我就是專心地貼解決方案就好了.

要如何拿到 我們理解的 7 個字


C# code:

var emojiStr = "😇許😉1😊d🐨"; var stringInfo = new System.Globalization.StringInfo(emojiStr); // output: 取得人類理解的長度:7 OutputResult += "取得人類理解的長度:" + stringInfo.LengthInTextElements + "<br>";

再來一個問題就是,如果我要去得裡面的字呢? 習慣我會直接直接 .ToArray() ,但是這樣結果會變成

C# code:

var emojiStr = "😇許😉1😊d🐨"; //output: 測試直接 ToArray : &#65533;,&#65533;,許,&#65533;,&#65533;,1,&#65533;,&#65533;,d,&#65533;,&#65533; OutputResult += "測試直接 ToArray : " + string.Join(',', emojiStr.ToArray()) + "<br>";

這時候,要如何把他們列舉印出來

C# code:

var emojiStr = "😇許😉1😊d🐨"; var allTextElememts = new List<string>(); var textElementEnumerator = System.Globalization.StringInfo.GetTextElementEnumerator(emojiStr); while (textElementEnumerator.MoveNext()) { allTextElememts.Add(textElementEnumerator.Current.ToString()); } //output: 列舉所有的字 : 😇,許,😉,1,😊,d,🐨 OutputResult += "列舉所有的字 : " + string.Join(',', allTextElememts) + "<br>";

主要就測試到這邊,因為跟我想像的有點不同,紀錄一下測試結果,有需要的話可以看下方連結,觀念解釋得很清楚,主要我這邊是用 asp + .net core 3.1 ,測試一下,順手有專案開著就用了沒有使用 console


result:



reference:

https://schneids.net/emojis-and-string-length

https://www.cnblogs.com/sdflysha/p/20191026-split-string-to-character-list.html


當麻許的碎念筆記 2014 | Donma Hsu Design.