let myString = "☺️"
let emoji = "☺️☹️"
let characterSet = CharacterSet(charactersIn: emoji)
let range = (myString as NSString).rangeOfCharacter(from: characterSet)
(myString as NSString).substring(with: range)
(range as NSRange).location
(range as NSRange).length
(myString as NSString).length
substring == myString
このコードはPlaygroundsで実行できます。 myStringを絵文字の顔に変更してみてください。これらの文字を含む文字セットと比較したとき、2つの絵文字が正しくない長さを返します。
ここでNSStringとNSRangeを使用していますが、その値は簡単に説明できますが、これはSwift StringまたはRangeでの動作とまったく同じです。
顔文字のほとんどにmyStringを設定すると、その範囲は2の長さに戻り、部分文字列は他の場所で適切に使用できます。 「smiling face」絵文字と「frowning face」絵文字のみでは、範囲は1の長さに戻ります。いずれの場合も、文字列の長さは2に戻ります。与えられた範囲1の部分文字列は不完全で、それを自分自身と比較する例としてmyStringと比較すると、結果はfalseになります。興味深いことに、ユニコード仕様を見ると、これらの2種類のエモジスは、隣人と大きく異なるユニコード値を持っています。この2つのエモジスの範囲の結果は、2になります。
興味深いことに、
これはiOSのバグのようです。他の絵文字すべてで動作するので、私がここで間違って個人的に行うことができるものは考えられません。
この絵文字(記号)、または何か他のものを? –
これはUTF-16コードユニットの可能性が非常に高いです。笑顔と笑顔はU + 2639とU + 263A(BMP)で、他の絵文字は顔文字範囲(U + 01F600〜U + 01F64F)にあります。 – roeland