2015-12-22 23 views
15

我試圖將一個字符串分割成單個單詞/字符,但是當涉及到表情符號時我遇到了麻煩。安全地分割表情符號

首先,我不能簡單地用一個空字符,因爲表情符號,一般都具有長度> = 2

"".split("") 
["�", "�"] 

我發現一個emoji regex這主要是工程分割字符串,但現在我看到一些奇怪的肉色塊。我甚至在某些情況下看到它們在Twitter上顯示。

enter image description here

下面是示出了與肉質塊 http://codepen.io/positlabs/pen/QyEOEG?editors=011

enter image description here

UPDATE -----------

問題試行spliddit一個筆,而且我仍然看到了膚色字符的問題。有什麼方法可以將它們粘合在一起嗎?

http://codepen.io/positlabs/pen/rxLqwL?editors=001

回答

11

JavaScript的字符串是UTF-16,所以你的表情符號在內部表示爲兩個代碼單元:

> "\ud83d\ude0e" === "" 
true 

String.prototype.split功能並沒有真正在UTF-16關心surrogate pairs,所以它天真地顛倒了單個代碼單元並破壞了表情符號,因爲JavaScript沒有提供任何方式來處理字符串中的單個字符。

有沒有簡單的方法來處理它。您需要像spliddit這樣的庫來正確處理各個代碼單元。

我不是100%熟悉術語,所以請根據需要編輯我的答案。

+0

好的,spliddit很好,但它仍然無法重新組合膚色字符。我製作了一支新筆,並會更新我的問題。 –

+0

@positlabs:我現在沒有時間查看它,但我非常確定這是代碼執行。嘗試刪除除旗幟和手臂外的所有內容,然後嘗試刪除其中的一個:http://codepen.io/anon/pen/NxrOoW?editors=001 – Blender

+1

@positlabs:其實,它只是Chrome。我上面的例子適用於Safari和Firefox。可能是一個錯誤。我會看看是否有一些解決方法。 – Blender

0

spliddit不能正確當前分裂例如這個印地文文本分成5個字符:「अनुच्छेद」

您需要的字形分離器庫: https://github.com/orling/grapheme-splitter 這是一個全面實施UAX-29 Unicode的標準,將分裂甚至最奇特的字母,表情符號只是衆多使用案例之一