2015-12-22 5 views
15

文字列を1つの単語/文字に分割しようとしていますが、絵文字に関しては問題があります。絵文字は、一般的に長さ> = 2絵文字を安全に分割する

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

を持っているので

まず第一に、私は単純に空の文字を使用して文字列を分割することはできません私は主に働くemoji regexを見つけましたが、今私が見ていますいくつかの奇妙な肌色のブロック。私はそれらがいくつかのケースでツイッターに現れるのを見ています。

enter image description here

ここで肉質ブロックsplidditを試す http://codepen.io/positlabs/pen/QyEOEG?editors=011

enter image description here

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

に問題があることを示してペンです、私はまだスキントーン文字の問題を見ています。それらを一緒に戻すために何らかの方法がありますか?

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

答えて

11

あなたの絵文字が内部で2つのコード単位として表現されるようにするJavaScriptの文字列は、UTF-16です:

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

String.prototype.split機能は本当にそう、UTF-16では約surrogate pairsを気にしませんJavaScriptは文字列の個々の文字を扱う方法を提供していないので、個々のコード単位を順々に逆にして絵文字を破ります。

これに対処する簡単な方法はありません。個々のコード単位を正しく処理するには、splidditのようなライブラリが必要です。

私はこの用語に100%慣れていないので、必要に応じて回答を編集してください。

+0

いいですが、splidditは素晴らしいですが、まだスキントーン文字を再結合できません。私は新しいペンを作って、私の質問を更新します。 –

+0

@positlabs:私は今それをチェックする時間がありませんが、私はかなりそれがcodepenが動作していると確信しています。フラグと武器以外のすべてを削除してみて、そのうちの1つを削除してみてください: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スタンドアーツで最もエキゾチックな文字を分割します。絵文字は多くのユースケースの1つにすぎません。