2017-06-06 4 views
3
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のバグのようです。他の絵文字すべてで動作するので、私がここで間違って個人的に行うことができるものは考えられません。

+0

この絵文字(記号)、または何か他のものを? –

+0

これはUTF-16コードユニットの可能性が非常に高いです。笑顔と笑顔は​​U + 2639とU + 263A(BMP)で、他の絵文字は顔文字範囲(U + 01F600〜U + 01F64F)にあります。 – roeland

答えて

1

ほとんどの答えが、コメントに収まるくらいにあなたがすでにこれを見てきた場合、私は知りません:)私と一緒に

を負担するが、私はあなたの問題は、プラットフォームの状態に対処されると思いますSwift 4の新機能に関するセクションのWWDC 2017(https://developer.apple.com/videos/play/wwdc2017/102/)からの連合トーク

約23分12秒の時点でビデオを見ると、Ted Kremenekはどのように修正されたかを話しますUnicode 9 Grapheme Brakingを使用して、Swift 4で期待通りにUnicode文字を分離します。

また、this question and answerをご覧ください。

はい...すべてこれは何を意味するのかを詳細に私に尋ねるが、彼らはそれに取り組んでいるかのように思えるしないでください:)

関連する問題