<div dir="ltr"><div style="font-size:12.8px">Hi,</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">I'm having some trouble to get emojis to work with FriBidi.</div><div style="font-size:12.8px">Basic emoji works fine, but when using emoji modifiers in a RTL language, the modifiers end up before the emoji.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Here I have a string with an arabic text, the emoji U+1f476 (a baby) and a tone modifier U+1f3fb:</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">const char utf8_input[] = u8"اختبار \U0001f476\U0001f3fb";</div><div style="font-size:12.8px">int utf8_len = sizeof(utf8_input) - 1;</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">std::unique_ptr<FriBidiChar[]> unicode_str(new FriBidiChar[utf8_len]);</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">FriBidiCharSet utf8_charset = fribidi_parse_charset("UTF-8");</div><div style="font-size:12.8px">int len_unicode = fribidi_charset_to_unicode(utf8_charset, utf8_input,</div><div style="font-size:12.8px">                                             utf8_len, unicode_str.get());</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">std::unique_ptr<FriBidiCharType[]> bidi_types(new FriBidiCharType[len_unicode]);</div><div style="font-size:12.8px">std::unique_ptr<FriBidiLevel[]> levels(new FriBidiLevel[len_unicode]);</div><div style="font-size:12.8px">FriBidiParType base = FRIBIDI_PAR_ON;</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">fribidi_get_bidi_types(unicode_str.get(), len_unicode, bidi_types.get());</div><div style="font-size:12.8px">fribidi_get_par_embedding_levels(bidi_types.get(), len_unicode, &base, levels.get());</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">fribidi_reorder_line(0, bidi_types.get(), len_unicode, 0, base,</div><div style="font-size:12.8px">                     levels.get(), unicode_str.get(), NULL);</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">std::cout << std::hex;</div><div style="font-size:12.8px">for (int i = 0; i < len_unicode; ++i)</div><div style="font-size:12.8px">  {</div><div style="font-size:12.8px">    std::cout << "\\u" << unicode_str[i];</div><div style="font-size:12.8px">  }</div><div style="font-size:12.8px">std::cout << std::endl;</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Output:</div><div style="font-size:12.8px">\u1f3fb\u1f476\u20\u631\u627\u628\u62a\u62e\u627</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">As you can see the tone modifier U+1f3fb is first and then the emoji U+1f476 is next.</div><div style="font-size:12.8px">I've also tested this with log2vis().</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Is this a bug? If not, what is the correct way to handle emojis?</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Regards,</div><div style="font-size:12.8px">Romain Ouabdelkader.</div></div>