<div dir="ltr">FWIW: I can conclude that the third example does not render correctly in Gmail ...</div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 12, 2017 at 10:43 AM, Jens Persson <span dir="ltr"><<a href="mailto:jens@bitcycle.com" target="_blank">jens@bitcycle.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>I want a function f such that:</div><div><br></div><div>f("abc") == ["a", "b", "c"]</div><div><br></div><div>f("cafรฉ") == ["c", "a", "f", "รฉ"]</div><div><br></div><div>f("๐จโ๐ฉโ๐งโ๐ฆ๐ท๐พโโ๏ธ") == ["๐จโ๐ฉโ๐งโ๐ฆ", "๐ท๐พโโ๏ธ"]</div><div><br></div><div>I'm not sure if the last example renders correctly by mail for everyone but the input String contains these _two_ "natural/visual characters":</div><div>(1) A family emoji</div><div>(2) a construction worker (woman, with skin tone modifier) emoji.</div><div>and the result is an Array of two strings (one for each emoji).</div><div><br></div><div>The first two examples are easy, the third example is the tricky one.</div><div><br></div><div><div>Is there a (practical) way to do this (in Swift 3)?</div></div><div><br></div><div>/Jens</div><div><br></div><div><br></div><div><br></div><div>PS</div><div><br></div><div>It's OK if the function has to depend on eg a graphics context etc.</div><div>(I tried writing a function so that it extracts the glyphs, using NSTextStorage, NSLayoutManager and the AppleColorEmoji font, but it says that "๐จโ๐ฉโ๐งโ๐ฆ๐ท๐พโโ๏ธ" contains 18(!) glyphs, whereas eg "cafรฉ" contains 4 as expected.)</div><div><br></div><div><div>If the emojis of the third example doesn't look like they should in this mail, here is another way to write the exact same example using only simple text:</div><div><br></div><div>let inputOfThirdExample = "\u{1F468}\u{200D}\u{1F469}\u{<wbr>200D}\u{1F467}\u{200D}\u{<wbr>1F466}\u{1F477}\u{1F3FE}\u{<wbr>200D}\u{2640}\u{FE0F}"<br></div><div><br></div><div>let result = f(inputOfThirdExample)</div><div><div><br></div><div>let expectedResult = ["\u{1F468}\u{200D}\u{1F469}\<wbr>u{200D}\u{1F467}\u{200D}\u{<wbr>1F466}", "\u{1F477}\u{1F3FE}\u{200D}\u{<wbr>2640}\u{FE0F}"]</div><div><br></div><div>print(result.elementsEqual(<wbr>result)) // Should print true<br></div></div></div><div><br></div><div><br></div></div>
</blockquote></div><br></div>