Skip to main content
deleted 874 characters in body
Source Link
MT0
  • 172.7k
  • 12
  • 70
  • 136

A small function that handles both combining diacritics and 2UTF-byte characters8 strings can have:

  • Combining diacritics such as which composed of the b character and a following ~ diacritic generated by the unicode escape sequnce \u0303;
  • Multi-byte characters such as 🎥; which is generated by the multi-byte unicode escape sequence \uD83C\uDFA5; and
  • Multiple characters may be combined together with a zero-width joiner character (given by the unicode escape sequence \u200D). For example, the character 👨‍👩‍👦 can be composed using the individual (multi-byte) emojis 👨 then a zero-width joiner then 👩 then another zero-width joiner then 👦 such that the entire 3-person character is 8-bytes (\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC66).

This will handle reversing all 3 cases and keeping the bytes in the correct order such that the characters are reversed (rather than naively reversing the bytes of the string):

(function(){ var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) // Comb. Diacritical Marks || (0x1AB0 <= code && code <= 0x1AFF) // Comb. Diacritical Marks Extended || (0x1DC0 <= code && code <= 0x1DFF) // Comb. Diacritical Marks Supplement || (0x20D0 <= code && code <= 0x20FF) // Comb. Diacritical Marks for Symbols || (0xFE20 <= code && code <= 0xFE2F); // Comb. Half Marks }; String.prototype.reverse = function() { varlet output = "","";     for ( let i  = this.length - 1, length; i > 0; )  width; { for ( ;let iwidth >== 0; --i ) {  let widthhas_zero_width_joiner = 1;false;  while( i > 0 && isCombiningDiacritic( this.charCodeAt(i-1) ) ) { --i; width++; } do { --i; width++; if (   i > 0   && "\uDC00" <= this[i] && this[i] <= "\uDFFF"   && "\uD800" <= this[i-1] && this[i-1] <= "\uDBFF"   )   {   --i;   width++;   }  has_zero_width_joiner = i > 0 && "\u200D" == this[i-1]; if ( has_zero_width_joiner ) { --i; width++; }   } while( i > 0 && has_zero_width_joiner ); output += this.substr( i, width ); } return output; } })(); // Tests [ 'abcdefg', 'ab\u0303c', 'a\uD83C\uDFA5b', 'a\uD83C\uDFA5b\uD83C\uDFA6c', 'a\uD83C\uDFA5b\u0306c\uD83C\uDFA6d', 'TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡', // copied from http://stackoverflow.com/a/1732454/1509264  'What 👨‍👩‍👦 is this?' ].forEach( function(str){ console.log( str + " -> " + str.reverse() ); } ); 

 

The above code identifies some of the more commonly used combining diacritics. A more complete list of combining diacritics (that could be swapped into the above code) is:


Update 2:

Handling zero-width joiners.

(function(){ var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) // Comb. Diacritical Marks || (0x1AB0 <= code && code <= 0x1AFF) // Comb. Diacritical Marks Extended || (0x1DC0 <= code && code <= 0x1DFF) // Comb. Diacritical Marks Supplement || (0x20D0 <= code && code <= 0x20FF) // Comb. Diacritical Marks for Symbols || (0xFE20 <= code && code <= 0xFE2F); // Comb. Half Marks }; String.prototype.reverse = function() { let output = ""; for ( let i = this.length; i > 0; ) { let width = 0; let has_zero_width_joiner = false; while( i > 0 && isCombiningDiacritic( this.charCodeAt(i-1) ) ) { --i; width++; } do { --i; width++; if ( i > 0 && "\uDC00" <= this[i] && this[i] <= "\uDFFF" && "\uD800" <= this[i-1] && this[i-1] <= "\uDBFF" ) { --i; width++; } has_zero_width_joiner = i > 0 && "\u200D" == this[i-1]; if ( has_zero_width_joiner ) { --i; width++; } } while( i > 0 && has_zero_width_joiner ); output += this.substr( i, width ); } return output; } })(); // Tests [ 'abcdefg', 'ab\u0303c', 'a\uD83C\uDFA5b', 'a\uD83C\uDFA5b\uD83C\uDFA6c', 'a\uD83C\uDFA5b\u0306c\uD83C\uDFA6d', 'TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡', // copied from http://stackoverflow.com/a/1732454/1509264 'What 👨‍👩‍👦 is this?' ].forEach( function(str){ console.log( str + " -> " + str.reverse() ); } );

A small function that handles both combining diacritics and 2-byte characters:

(function(){ var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) // Comb. Diacritical Marks || (0x1AB0 <= code && code <= 0x1AFF) // Comb. Diacritical Marks Extended || (0x1DC0 <= code && code <= 0x1DFF) // Comb. Diacritical Marks Supplement || (0x20D0 <= code && code <= 0x20FF) // Comb. Diacritical Marks for Symbols || (0xFE20 <= code && code <= 0xFE2F); // Comb. Half Marks }; String.prototype.reverse = function() { var output = "",   i  = this.length - 1,  width;  for ( ; i >= 0; --i ) {  width = 1; while( i > 0 && isCombiningDiacritic( this.charCodeAt(i) ) ) { --i; width++; } if ( i > 0 && "\uDC00" <= this[i] && this[i] <= "\uDFFF" && "\uD800" <= this[i-1] && this[i-1] <= "\uDBFF" ) { --i; width++; } output += this.substr( i, width ); } return output; } })(); // Tests [ 'abcdefg', 'ab\u0303c', 'a\uD83C\uDFA5b', 'a\uD83C\uDFA5b\uD83C\uDFA6c', 'a\uD83C\uDFA5b\u0306c\uD83C\uDFA6d', 'TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡' // copied from http://stackoverflow.com/a/1732454/1509264 ].forEach( function(str){ console.log( str + " -> " + str.reverse() ); } ); 

 

A more complete list of combining diacritics is:


Update 2:

Handling zero-width joiners.

(function(){ var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) // Comb. Diacritical Marks || (0x1AB0 <= code && code <= 0x1AFF) // Comb. Diacritical Marks Extended || (0x1DC0 <= code && code <= 0x1DFF) // Comb. Diacritical Marks Supplement || (0x20D0 <= code && code <= 0x20FF) // Comb. Diacritical Marks for Symbols || (0xFE20 <= code && code <= 0xFE2F); // Comb. Half Marks }; String.prototype.reverse = function() { let output = ""; for ( let i = this.length; i > 0; ) { let width = 0; let has_zero_width_joiner = false; while( i > 0 && isCombiningDiacritic( this.charCodeAt(i-1) ) ) { --i; width++; } do { --i; width++; if ( i > 0 && "\uDC00" <= this[i] && this[i] <= "\uDFFF" && "\uD800" <= this[i-1] && this[i-1] <= "\uDBFF" ) { --i; width++; } has_zero_width_joiner = i > 0 && "\u200D" == this[i-1]; if ( has_zero_width_joiner ) { --i; width++; } } while( i > 0 && has_zero_width_joiner ); output += this.substr( i, width ); } return output; } })(); // Tests [ 'abcdefg', 'ab\u0303c', 'a\uD83C\uDFA5b', 'a\uD83C\uDFA5b\uD83C\uDFA6c', 'a\uD83C\uDFA5b\u0306c\uD83C\uDFA6d', 'TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡', // copied from http://stackoverflow.com/a/1732454/1509264 'What 👨‍👩‍👦 is this?' ].forEach( function(str){ console.log( str + " -> " + str.reverse() ); } );

UTF-8 strings can have:

  • Combining diacritics such as which composed of the b character and a following ~ diacritic generated by the unicode escape sequnce \u0303;
  • Multi-byte characters such as 🎥; which is generated by the multi-byte unicode escape sequence \uD83C\uDFA5; and
  • Multiple characters may be combined together with a zero-width joiner character (given by the unicode escape sequence \u200D). For example, the character 👨‍👩‍👦 can be composed using the individual (multi-byte) emojis 👨 then a zero-width joiner then 👩 then another zero-width joiner then 👦 such that the entire 3-person character is 8-bytes (\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC66).

This will handle reversing all 3 cases and keeping the bytes in the correct order such that the characters are reversed (rather than naively reversing the bytes of the string):

(function(){ var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) // Comb. Diacritical Marks || (0x1AB0 <= code && code <= 0x1AFF) // Comb. Diacritical Marks Extended || (0x1DC0 <= code && code <= 0x1DFF) // Comb. Diacritical Marks Supplement || (0x20D0 <= code && code <= 0x20FF) // Comb. Diacritical Marks for Symbols || (0xFE20 <= code && code <= 0xFE2F); // Comb. Half Marks }; String.prototype.reverse = function() { let output = "";    for ( let i = this.length; i > 0; )  { let width = 0; let has_zero_width_joiner = false;  while( i > 0 && isCombiningDiacritic( this.charCodeAt(i-1) ) ) { --i; width++; } do { --i; width++; if (   i > 0   && "\uDC00" <= this[i] && this[i] <= "\uDFFF"   && "\uD800" <= this[i-1] && this[i-1] <= "\uDBFF"   )   {   --i;   width++;   }  has_zero_width_joiner = i > 0 && "\u200D" == this[i-1]; if ( has_zero_width_joiner ) { --i; width++; }   } while( i > 0 && has_zero_width_joiner ); output += this.substr( i, width ); } return output; } })(); // Tests [ 'abcdefg', 'ab\u0303c', 'a\uD83C\uDFA5b', 'a\uD83C\uDFA5b\uD83C\uDFA6c', 'a\uD83C\uDFA5b\u0306c\uD83C\uDFA6d', 'TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡', // copied from http://stackoverflow.com/a/1732454/1509264  'What 👨‍👩‍👦 is this?' ].forEach( function(str){ console.log( str + " -> " + str.reverse() ); } );

The above code identifies some of the more commonly used combining diacritics. A more complete list of combining diacritics (that could be swapped into the above code) is:

added 419 characters in body
Source Link
MT0
  • 172.7k
  • 12
  • 70
  • 136
 var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) || (0x0483 <= code && code <= 0x0489) || (0x0591 <= code && code <= 0x05BD) || (code == 0x05BF) || (0x05C1 <= code && code <= 0x05C2) || (0x05C4 <= code && code <= 0x05C5) || (code == 0x05C7) || (0x0610 <= code && code <= 0x061A) || (0x064B <= code && code <= 0x065F) || (code == 0x0670) || (0x06D6 <= code && code <= 0x06DC) || (0x06DF <= code && code <= 0x06E4) || (0x06E7 <= code && code <= 0x06E8) || (0x06EA <= code && code <= 0x06ED) || (code == 0x0711) || (0x0730 <= code && code <= 0x074A) || (0x07A6 <= code && code <= 0x07B0) || (0x07EB <= code && code <= 0x07F3) || (code == 0x07FD) || (0x0816 <= code && code <= 0x0819) || (0x081B <= code && code <= 0x0823) || (0x0825 <= code && code <= 0x0827) || (0x0829 <= code && code <= 0x082D) || (0x0859 <= code && code <= 0x085B) || (0x08D3 <= code && code <= 0x08E1) || (0x08E3 <= code && code <= 0x0902) || (code == 0x093A) || (code == 0x093C) || (0x0941 <= code && code <= 0x0948) || (code == 0x094D) || (0x0951 <= code && code <= 0x0957) || (0x0962 <= code && code <= 0x0963) || (code == 0x0981) || (code == 0x09BC) || (0x09C1 <= code && code <= 0x09C4) || (code == 0x09CD) || (0x09E2 <= code && code <= 0x09E3) || (0x09FE <= code && code <= 0x0A02) || (code == 0x0A3C) || (0x0A41 <= code && code <= 0x0A51) || (0x0A70 <= code && code <= 0x0A71) || (code == 0x0A75) || (0x0A81 <= code && code <= 0x0A82) || (code == 0x0ABC) || (0x0AC1 <= code && code <= 0x0AC8) || (code == 0x0ACD) || (0x0AE2 <= code && code <= 0x0AE3) || (0x0AFA <= code && code <= 0x0B01) || (code == 0x0B3C) || (code == 0x0B3F) || (0x0B41 <= code && code <= 0x0B44) || (0x0B4D <= code && code <= 0x0B56) || (0x0B62 <= code && code <= 0x0B63) || (code == 0x0B82) || (code == 0x0BC0) || (code == 0x0BCD) || (code == 0x0C00) || (code == 0x0C04) || (0x0C3E <= code && code <= 0x0C40) || (0x0C46 <= code && code <= 0x0C56) || (0x0C62 <= code && code <= 0x0C63) || (code == 0x0C81) || (code == 0x0CBC) || (0x0CCC <= code && code <= 0x0CCD) || (0x0CE2 <= code && code <= 0x0CE3) || (0x0D00 <= code && code <= 0x0D01) || (0x0D3B <= code && code <= 0x0D3C) || (0x0D41 <= code && code <= 0x0D44) || (code == 0x0D4D) || (0x0D62 <= code && code <= 0x0D63) || (code == 0x0DCA) || (0x0DD2 <= code && code <= 0x0DD6) || (code == 0x0E31) || (0x0E34 <= code && code <= 0x0E3A) || (0x0E47 <= code && code <= 0x0E4E) || (code == 0x0EB1) || (0x0EB4 <= code && code <= 0x0EBC) || (0x0EC8 <= code && code <= 0x0ECD) || (0x0F18 <= code && code <= 0x0F19) || (code == 0x0F35) || (code == 0x0F37) || (code == 0x0F39) || (0x0F71 <= code && code <= 0x0F7E) || (0x0F80 <= code && code <= 0x0F84) || (0x0F86 <= code && code <= 0x0F87) || (0x0F8D <= code && code <= 0x0FBC) || (code == 0x0FC6) || (0x102D <= code && code <= 0x1030) || (0x1032 <= code && code <= 0x1037) || (0x1039 <= code && code <= 0x103A) || (0x103D <= code && code <= 0x103E) || (0x1058 <= code && code <= 0x1059) || (0x105E <= code && code <= 0x1060) || (0x1071 <= code && code <= 0x1074) || (code == 0x1082) || (0x1085 <= code && code <= 0x1086) || (code == 0x108D) || (code == 0x109D) || (0x135D <= code && code <= 0x135F) || (0x1712 <= code && code <= 0x1714) || (0x1732 <= code && code <= 0x1734) || (0x1752 <= code && code <= 0x1753) || (0x1772 <= code && code <= 0x1773) || (0x17B4 <= code && code <= 0x17B5) || (0x17B7 <= code && code <= 0x17BD) || (code == 0x17C6) || (0x17C9 <= code && code <= 0x17D3) || (code == 0x17DD) || (0x180B <= code && code <= 0x180D) || (0x1885 <= code && code <= 0x1886) || (code == 0x18A9) || (0x1920 <= code && code <= 0x1922) || (0x1927 <= code && code <= 0x1928) || (code == 0x1932) || (0x1939 <= code && code <= 0x193B) || (0x1A17 <= code && code <= 0x1A18) || (code == 0x1A1B) || (code == 0x1A56) || (0x1A58 <= code && code <= 0x1A60) || (code == 0x1A62) || (0x1A65 <= code && code <= 0x1A6C) || (0x1A73 <= code && code <= 0x1A7F) || (0x1AB0 <= code && code <= 0x1B03) || (code == 0x1B34) || (0x1B36 <= code && code <= 0x1B3A) || (code == 0x1B3C) || (code == 0x1B42) || (0x1B6B <= code && code <= 0x1B73) || (0x1B80 <= code && code <= 0x1B81) || (0x1BA2 <= code && code <= 0x1BA5) || (0x1BA8 <= code && code <= 0x1BA9) || (0x1BAB <= code && code <= 0x1BAD) || (code == 0x1BE6) || (0x1BE8 <= code && code <= 0x1BE9) || (code == 0x1BED) || (0x1BEF <= code && code <= 0x1BF1) || (0x1C2C <= code && code <= 0x1C33) || (0x1C36 <= code && code <= 0x1C37) || (0x1CD0 <= code && code <= 0x1CD2) || (0x1CD4 <= code && code <= 0x1CE0) || (0x1CE2 <= code && code <= 0x1CE8) || (code == 0x1CED) || (code == 0x1CF4) || (0x1CF8 <= code && code <= 0x1CF9) || (0x1DC0 <= code && code <= 0x1DFF) || (0x20D0 <= code && code <= 0x20F0) || (0x2CEF <= code && code <= 0x2CF1) || (code == 0x2D7F) || (0x2DE0 <= code && code <= 0x2DFF) || (0x302A <= code && code <= 0x302D) || (0x3099 <= code && code <= 0x309A) || (0xA66F <= code && code <= 0xA672) || (0xA674 <= code && code <= 0xA67D) || (0xA69E <= code && code <= 0xA69F) || (0xA6F0 <= code && code <= 0xA6F1) || (code == 0xA802) || (code == 0xA806) || (code == 0xA80B) || (0xA825 <= code && code <= 0xA826) || (0xA8C4 <= code && code <= 0xA8C5) || (0xA8E0 <= code && code <= 0xA8F1) || (code == 0xA8FF) || (0xA926 <= code && code <= 0xA92D) || (0xA947 <= code && code <= 0xA951) || (0xA980 <= code && code <= 0xA982) || (code == 0xA9B3) || (0xA9B6 <= code && code <= 0xA9B9) || (0xA9BC <= code && code <= 0xA9BD) || (code == 0xA9E5) || (0xAA29 <= code && code <= 0xAA2E) || (0xAA31 <= code && code <= 0xAA32) || (0xAA35 <= code && code <= 0xAA36) || (code == 0xAA43) || (code == 0xAA4C) || (code == 0xAA7C) || (code == 0xAAB0) || (0xAAB2 <= code && code <= 0xAAB4) || (0xAAB7 <= code && code <= 0xAAB8) || (0xAABE <= code && code <= 0xAABF) || (code == 0xAAC1) || (0xAAEC <= code && code <= 0xAAED) || (code == 0xAAF6) || (code == 0xABE5) || (code == 0xABE8) || (code == 0xABED) || (code == 0xFB1E) || (0xFE00 <= code && code <= 0xFE0F) || (0xFE20 <= code && code <= 0xFE2F) || (code == 0x101FD) || (code == 0x102E0) || (0x10376 <= code && code <= 0x1037A) || (0x10A01 <= code && code <= 0x10A0F) || (0x10A38 <= code && code <= 0x10A3F) || (0x10AE5 <= code && code <= 0x10AE6) || (0x10D24 <= code && code <= 0x10D27) || (0x10F46 <= code && code <= 0x10F50) || (code == 0x11001) || (0x11038 <= code && code <= 0x11046) || (0x1107F <= code && code <= 0x11081) || (0x110B3 <= code && code <= 0x110B6) || (0x110B9 <= code && code <= 0x110BA) || (0x11100 <= code && code <= 0x11102) || (0x11127 <= code && code <= 0x1112B) || (0x1112D <= code && code <= 0x11134) || (code == 0x11173) || (0x11180 <= code && code <= 0x11181) || (0x111B6 <= code && code <= 0x111BE) || (0x111C9 <= code && code <= 0x111CC) || (0x1122F <= code && code <= 0x11231) || (code == 0x11234) || (0x11236 <= code && code <= 0x11237) || (code == 0x1123E) || (code == 0x112DF) || (0x112E3 <= code && code <= 0x112EA) || (0x11300 <= code && code <= 0x11301) || (0x1133B <= code && code <= 0x1133C) || (code == 0x11340) || (0x11366 <= code && code <= 0x11374) || (0x11438 <= code && code <= 0x1143F) || (0x11442 <= code && code <= 0x11444) || (code == 0x11446) || (code == 0x1145E) || (0x114B3 <= code && code <= 0x114B8) || (code == 0x114BA) || (0x114BF <= code && code <= 0x114C0) || (0x114C2 <= code && code <= 0x114C3) || (0x115B2 <= code && code <= 0x115B5) || (0x115BC <= code && code <= 0x115BD) || (0x115BF <= code && code <= 0x115C0) || (0x115DC <= code && code <= 0x115DD) || (0x11633 <= code && code <= 0x1163A) || (code == 0x1163D) || (0x1163F <= code && code <= 0x11640) || (code == 0x116AB) || (code == 0x116AD) || (0x116B0 <= code && code <= 0x116B5) || (code == 0x116B7) || (0x1171D <= code && code <= 0x1171F) || (0x11722 <= code && code <= 0x11725) || (0x11727 <= code && code <= 0x1172B) || (0x1182F <= code && code <= 0x11837) || (0x11839 <= code && code <= 0x1183A) || (0x119D4 <= code && code <= 0x119DB) || (code == 0x119E0) || (0x11A01 <= code && code <= 0x11A06) || (0x11A09 <= code && code <= 0x11A0A) || (0x11A33 <= code && code <= 0x11A38) || (0x11A3B <= code && code <= 0x11A3E) || (code == 0x11A47) || (0x11A51 <= code && code <= 0x11A56) || (0x11A59 <= code && code <= 0x11A5B) || (0x11A8A <= code && code <= 0x11A96) || (0x11A98 <= code && code <= 0x11A99) || (0x11C30 <= code && code <= 0x11C3D) || (0x11C92 <= code && code <= 0x11CA7) || (0x11CAA <= code && code <= 0x11CB0) || (0x11CB2 <= code && code <= 0x11CB3) || (0x11CB5 <= code && code <= 0x11CB6) || (0x11D31 <= code && code <= 0x11D45) || (code == 0x11D47) || (0x11D90 <= code && code <= 0x11D91) || (code == 0x11D95) || (code == 0x11D97) || (0x11EF3 <= code && code <= 0x11EF4) || (0x16AF0 <= code && code <= 0x16AF4) || (0x16B30 <= code && code <= 0x16B36) || (code == 0x16F4F) || (0x16F8F <= code && code <= 0x16F92) || (0x1BC9D <= code && code <= 0x1BC9E) || (0x1D167 <= code && code <= 0x1D169) || (0x1D17B <= code && code <= 0x1D182) || (0x1D185 <= code && code <= 0x1D18B) || (0x1D1AA <= code && code <= 0x1D1AD) || (0x1D242 <= code && code <= 0x1D244) || (0x1DA00 <= code && code <= 0x1DA36) || (0x1DA3B <= code && code <= 0x1DA6C) || (code == 0x1DA75) || (code == 0x1DA84) || (0x1DA9B <= code && code <= 0x1E02A) || (0x1E130 <= code && code <= 0x1E136) || (0x1E2EC <= code && code <= 0x1E2EF) || (0x1E8D0 <= code && code <= 0x1E8D6) || (0x1E944 <= code && code <= 0x1E94A) || (0xE0100 <= code && code <= 0xE01EF); }; var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) || (0x0483 <= code && code <= 0x0489) || (0x0591 <= code && code <= 0x05BD) || (code == 0x05BF) || (0x05C1 <= code && code <= 0x05C2) || (0x05C4 <= code && code <= 0x05C5) || (code == 0x05C7) || (0x0610 <= code && code <= 0x061A) || (0x064B <= code && code <= 0x065F) || (code == 0x0670) || (0x06D6 <= code && code <= 0x06DC) || (0x06DF <= code && code <= 0x06E4) || (0x06E7 <= code && code <= 0x06E8) || (0x06EA <= code && code <= 0x06ED) || (code == 0x0711) || (0x0730 <= code && code <= 0x074A) || (0x07A6 <= code && code <= 0x07B0) || (0x07EB <= code && code <= 0x07F3) || (code == 0x07FD) || (0x0816 <= code && code <= 0x0819) || (0x081B <= code && code <= 0x0823) || (0x0825 <= code && code <= 0x0827) || (0x0829 <= code && code <= 0x082D) || (0x0859 <= code && code <= 0x085B) || (0x08D3 <= code && code <= 0x08E1) || (0x08E3 <= code && code <= 0x0902) || (code == 0x093A) || (code == 0x093C) || (0x0941 <= code && code <= 0x0948) || (code == 0x094D) || (0x0951 <= code && code <= 0x0957) || (0x0962 <= code && code <= 0x0963) || (code == 0x0981) || (code == 0x09BC) || (0x09C1 <= code && code <= 0x09C4) || (code == 0x09CD) || (0x09E2 <= code && code <= 0x09E3) || (0x09FE <= code && code <= 0x0A02) || (code == 0x0A3C) || (0x0A41 <= code && code <= 0x0A51) || (0x0A70 <= code && code <= 0x0A71) || (code == 0x0A75) || (0x0A81 <= code && code <= 0x0A82) || (code == 0x0ABC) || (0x0AC1 <= code && code <= 0x0AC8) || (code == 0x0ACD) || (0x0AE2 <= code && code <= 0x0AE3) || (0x0AFA <= code && code <= 0x0B01) || (code == 0x0B3C) || (code == 0x0B3F) || (0x0B41 <= code && code <= 0x0B44) || (0x0B4D <= code && code <= 0x0B56) || (0x0B62 <= code && code <= 0x0B63) || (code == 0x0B82) || (code == 0x0BC0) || (code == 0x0BCD) || (code == 0x0C00) || (code == 0x0C04) || (0x0C3E <= code && code <= 0x0C40) || (0x0C46 <= code && code <= 0x0C56) || (0x0C62 <= code && code <= 0x0C63) || (code == 0x0C81) || (code == 0x0CBC) || (0x0CCC <= code && code <= 0x0CCD) || (0x0CE2 <= code && code <= 0x0CE3) || (0x0D00 <= code && code <= 0x0D01) || (0x0D3B <= code && code <= 0x0D3C) || (0x0D41 <= code && code <= 0x0D44) || (code == 0x0D4D) || (0x0D62 <= code && code <= 0x0D63) || (code == 0x0DCA) || (0x0DD2 <= code && code <= 0x0DD6) || (code == 0x0E31) || (0x0E34 <= code && code <= 0x0E3A) || (0x0E47 <= code && code <= 0x0E4E) || (code == 0x0EB1) || (0x0EB4 <= code && code <= 0x0EBC) || (0x0EC8 <= code && code <= 0x0ECD) || (0x0F18 <= code && code <= 0x0F19) || (code == 0x0F35) || (code == 0x0F37) || (code == 0x0F39) || (0x0F71 <= code && code <= 0x0F7E) || (0x0F80 <= code && code <= 0x0F84) || (0x0F86 <= code && code <= 0x0F87) || (0x0F8D <= code && code <= 0x0FBC) || (code == 0x0FC6) || (0x102D <= code && code <= 0x1030) || (0x1032 <= code && code <= 0x1037) || (0x1039 <= code && code <= 0x103A) || (0x103D <= code && code <= 0x103E) || (0x1058 <= code && code <= 0x1059) || (0x105E <= code && code <= 0x1060) || (0x1071 <= code && code <= 0x1074) || (code == 0x1082) || (0x1085 <= code && code <= 0x1086) || (code == 0x108D) || (code == 0x109D) || (0x135D <= code && code <= 0x135F) || (0x1712 <= code && code <= 0x1714) || (0x1732 <= code && code <= 0x1734) || (0x1752 <= code && code <= 0x1753) || (0x1772 <= code && code <= 0x1773) || (0x17B4 <= code && code <= 0x17B5) || (0x17B7 <= code && code <= 0x17BD) || (code == 0x17C6) || (0x17C9 <= code && code <= 0x17D3) || (code == 0x17DD) || (0x180B <= code && code <= 0x180D) || (0x1885 <= code && code <= 0x1886) || (code == 0x18A9) || (0x1920 <= code && code <= 0x1922) || (0x1927 <= code && code <= 0x1928) || (code == 0x1932) || (0x1939 <= code && code <= 0x193B) || (0x1A17 <= code && code <= 0x1A18) || (code == 0x1A1B) || (code == 0x1A56) || (0x1A58 <= code && code <= 0x1A60) || (code == 0x1A62) || (0x1A65 <= code && code <= 0x1A6C) || (0x1A73 <= code && code <= 0x1A7F) || (0x1AB0 <= code && code <= 0x1B03) || (code == 0x1B34) || (0x1B36 <= code && code <= 0x1B3A) || (code == 0x1B3C) || (code == 0x1B42) || (0x1B6B <= code && code <= 0x1B73) || (0x1B80 <= code && code <= 0x1B81) || (0x1BA2 <= code && code <= 0x1BA5) || (0x1BA8 <= code && code <= 0x1BA9) || (0x1BAB <= code && code <= 0x1BAD) || (code == 0x1BE6) || (0x1BE8 <= code && code <= 0x1BE9) || (code == 0x1BED) || (0x1BEF <= code && code <= 0x1BF1) || (0x1C2C <= code && code <= 0x1C33) || (0x1C36 <= code && code <= 0x1C37) || (0x1CD0 <= code && code <= 0x1CD2) || (0x1CD4 <= code && code <= 0x1CE0) || (0x1CE2 <= code && code <= 0x1CE8) || (code == 0x1CED) || (code == 0x1CF4) || (0x1CF8 <= code && code <= 0x1CF9) || (0x1DC0 <= code && code <= 0x1DFF) || (0x20D0 <= code && code <= 0x20F0) || (0x2CEF <= code && code <= 0x2CF1) || (code == 0x2D7F) || (0x2DE0 <= code && code <= 0x2DFF) || (0x302A <= code && code <= 0x302D) || (0x3099 <= code && code <= 0x309A) || (0xA66F <= code && code <= 0xA672) || (0xA674 <= code && code <= 0xA67D) || (0xA69E <= code && code <= 0xA69F) || (0xA6F0 <= code && code <= 0xA6F1) || (code == 0xA802) || (code == 0xA806) || (code == 0xA80B) || (0xA825 <= code && code <= 0xA826) || (0xA8C4 <= code && code <= 0xA8C5) || (0xA8E0 <= code && code <= 0xA8F1) || (code == 0xA8FF) || (0xA926 <= code && code <= 0xA92D) || (0xA947 <= code && code <= 0xA951) || (0xA980 <= code && code <= 0xA982) || (code == 0xA9B3) || (0xA9B6 <= code && code <= 0xA9B9) || (0xA9BC <= code && code <= 0xA9BD) || (code == 0xA9E5) || (0xAA29 <= code && code <= 0xAA2E) || (0xAA31 <= code && code <= 0xAA32) || (0xAA35 <= code && code <= 0xAA36) || (code == 0xAA43) || (code == 0xAA4C) || (code == 0xAA7C) || (code == 0xAAB0) || (0xAAB2 <= code && code <= 0xAAB4) || (0xAAB7 <= code && code <= 0xAAB8) || (0xAABE <= code && code <= 0xAABF) || (code == 0xAAC1) || (0xAAEC <= code && code <= 0xAAED) || (code == 0xAAF6) || (code == 0xABE5) || (code == 0xABE8) || (code == 0xABED) || (code == 0xFB1E) || (0xFE00 <= code && code <= 0xFE0F) || (0xFE20 <= code && code <= 0xFE2F) || (code == 0x101FD) || (code == 0x102E0) || (0x10376 <= code && code <= 0x1037A) || (0x10A01 <= code && code <= 0x10A0F) || (0x10A38 <= code && code <= 0x10A3F) || (0x10AE5 <= code && code <= 0x10AE6) || (0x10D24 <= code && code <= 0x10D27) || (0x10F46 <= code && code <= 0x10F50) || (code == 0x11001) || (0x11038 <= code && code <= 0x11046) || (0x1107F <= code && code <= 0x11081) || (0x110B3 <= code && code <= 0x110B6) || (0x110B9 <= code && code <= 0x110BA) || (0x11100 <= code && code <= 0x11102) || (0x11127 <= code && code <= 0x1112B) || (0x1112D <= code && code <= 0x11134) || (code == 0x11173) || (0x11180 <= code && code <= 0x11181) || (0x111B6 <= code && code <= 0x111BE) || (0x111C9 <= code && code <= 0x111CC) || (0x1122F <= code && code <= 0x11231) || (code == 0x11234) || (0x11236 <= code && code <= 0x11237) || (code == 0x1123E) || (code == 0x112DF) || (0x112E3 <= code && code <= 0x112EA) || (0x11300 <= code && code <= 0x11301) || (0x1133B <= code && code <= 0x1133C) || (code == 0x11340) || (0x11366 <= code && code <= 0x11374) || (0x11438 <= code && code <= 0x1143F) || (0x11442 <= code && code <= 0x11444) || (code == 0x11446) || (code == 0x1145E) || (0x114B3 <= code && code <= 0x114B8) || (code == 0x114BA) || (0x114BF <= code && code <= 0x114C0) || (0x114C2 <= code && code <= 0x114C3) || (0x115B2 <= code && code <= 0x115B5) || (0x115BC <= code && code <= 0x115BD) || (0x115BF <= code && code <= 0x115C0) || (0x115DC <= code && code <= 0x115DD) || (0x11633 <= code && code <= 0x1163A) || (code == 0x1163D) || (0x1163F <= code && code <= 0x11640) || (code == 0x116AB) || (code == 0x116AD) || (0x116B0 <= code && code <= 0x116B5) || (code == 0x116B7) || (0x1171D <= code && code <= 0x1171F) || (0x11722 <= code && code <= 0x11725) || (0x11727 <= code && code <= 0x1172B) || (0x1182F <= code && code <= 0x11837) || (0x11839 <= code && code <= 0x1183A) || (0x119D4 <= code && code <= 0x119DB) || (code == 0x119E0) || (0x11A01 <= code && code <= 0x11A06) || (0x11A09 <= code && code <= 0x11A0A) || (0x11A33 <= code && code <= 0x11A38) || (0x11A3B <= code && code <= 0x11A3E) || (code == 0x11A47) || (0x11A51 <= code && code <= 0x11A56) || (0x11A59 <= code && code <= 0x11A5B) || (0x11A8A <= code && code <= 0x11A96) || (0x11A98 <= code && code <= 0x11A99) || (0x11C30 <= code && code <= 0x11C3D) || (0x11C92 <= code && code <= 0x11CA7) || (0x11CAA <= code && code <= 0x11CB0) || (0x11CB2 <= code && code <= 0x11CB3) || (0x11CB5 <= code && code <= 0x11CB6) || (0x11D31 <= code && code <= 0x11D45) || (code == 0x11D47) || (0x11D90 <= code && code <= 0x11D91) || (code == 0x11D95) || (code == 0x11D97) || (0x11EF3 <= code && code <= 0x11EF4) || (0x16AF0 <= code && code <= 0x16AF4) || (0x16B30 <= code && code <= 0x16B36) || (code == 0x16F4F) || (0x16F8F <= code && code <= 0x16F92) || (0x1BC9D <= code && code <= 0x1BC9E) || (0x1D167 <= code && code <= 0x1D169) || (0x1D17B <= code && code <= 0x1D182) || (0x1D185 <= code && code <= 0x1D18B) || (0x1D1AA <= code && code <= 0x1D1AD) || (0x1D242 <= code && code <= 0x1D244) || (0x1DA00 <= code && code <= 0x1DA36) || (0x1DA3B <= code && code <= 0x1DA6C) || (code == 0x1DA75) || (code == 0x1DA84) || (0x1DA9B <= code && code <= 0x1E02A) || (0x1E130 <= code && code <= 0x1E136) || (0x1E2EC <= code && code <= 0x1E2EF) || (0x1E8D0 <= code && code <= 0x1E8D6) || (0x1E944 <= code && code <= 0x1E94A) || (0xE0100 <= code && code <= 0xE01EF); }; 

Update 2:

Handling zero-width joiners.

(function(){ var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) // Comb. Diacritical Marks || (0x1AB0 <= code && code <= 0x1AFF) // Comb. Diacritical Marks Extended || (0x1DC0 <= code && code <= 0x1DFF) // Comb. Diacritical Marks Supplement || (0x20D0 <= code && code <= 0x20FF) // Comb. Diacritical Marks for Symbols || (0xFE20 <= code && code <= 0xFE2F); // Comb. Half Marks }; String.prototype.reverse = function() { let output = ""; for ( let i = this.length; i > 0; ) { let width = 0; let has_zero_width_joiner = false; while( i > 0 && isCombiningDiacritic( this.charCodeAt(i-1) ) ) { --i; width++; } do { --i; width++; if ( i > 0 && "\uDC00" <= this[i] && this[i] <= "\uDFFF" && "\uD800" <= this[i-1] && this[i-1] <= "\uDBFF" ) { --i; width++; } has_zero_width_joiner = i > 0 && "\u200D" == this[i-1]; if ( has_zero_width_joiner ) { --i; width++; } } while( i > 0 && has_zero_width_joiner ); output += this.substr( i, width ); } return output; } })(); // Tests [ 'abcdefg', 'ab\u0303c', 'a\uD83C\uDFA5b', 'a\uD83C\uDFA5b\uD83C\uDFA6c', 'a\uD83C\uDFA5b\u0306c\uD83C\uDFA6d', 'TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡', // copied from http://stackoverflow.com/a/1732454/1509264 'What 👨‍👩‍👦 is this?' ].forEach( function(str){ console.log( str + " -> " + str.reverse() ); } );

 var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) || (0x0483 <= code && code <= 0x0489) || (0x0591 <= code && code <= 0x05BD) || (code == 0x05BF) || (0x05C1 <= code && code <= 0x05C2) || (0x05C4 <= code && code <= 0x05C5) || (code == 0x05C7) || (0x0610 <= code && code <= 0x061A) || (0x064B <= code && code <= 0x065F) || (code == 0x0670) || (0x06D6 <= code && code <= 0x06DC) || (0x06DF <= code && code <= 0x06E4) || (0x06E7 <= code && code <= 0x06E8) || (0x06EA <= code && code <= 0x06ED) || (code == 0x0711) || (0x0730 <= code && code <= 0x074A) || (0x07A6 <= code && code <= 0x07B0) || (0x07EB <= code && code <= 0x07F3) || (code == 0x07FD) || (0x0816 <= code && code <= 0x0819) || (0x081B <= code && code <= 0x0823) || (0x0825 <= code && code <= 0x0827) || (0x0829 <= code && code <= 0x082D) || (0x0859 <= code && code <= 0x085B) || (0x08D3 <= code && code <= 0x08E1) || (0x08E3 <= code && code <= 0x0902) || (code == 0x093A) || (code == 0x093C) || (0x0941 <= code && code <= 0x0948) || (code == 0x094D) || (0x0951 <= code && code <= 0x0957) || (0x0962 <= code && code <= 0x0963) || (code == 0x0981) || (code == 0x09BC) || (0x09C1 <= code && code <= 0x09C4) || (code == 0x09CD) || (0x09E2 <= code && code <= 0x09E3) || (0x09FE <= code && code <= 0x0A02) || (code == 0x0A3C) || (0x0A41 <= code && code <= 0x0A51) || (0x0A70 <= code && code <= 0x0A71) || (code == 0x0A75) || (0x0A81 <= code && code <= 0x0A82) || (code == 0x0ABC) || (0x0AC1 <= code && code <= 0x0AC8) || (code == 0x0ACD) || (0x0AE2 <= code && code <= 0x0AE3) || (0x0AFA <= code && code <= 0x0B01) || (code == 0x0B3C) || (code == 0x0B3F) || (0x0B41 <= code && code <= 0x0B44) || (0x0B4D <= code && code <= 0x0B56) || (0x0B62 <= code && code <= 0x0B63) || (code == 0x0B82) || (code == 0x0BC0) || (code == 0x0BCD) || (code == 0x0C00) || (code == 0x0C04) || (0x0C3E <= code && code <= 0x0C40) || (0x0C46 <= code && code <= 0x0C56) || (0x0C62 <= code && code <= 0x0C63) || (code == 0x0C81) || (code == 0x0CBC) || (0x0CCC <= code && code <= 0x0CCD) || (0x0CE2 <= code && code <= 0x0CE3) || (0x0D00 <= code && code <= 0x0D01) || (0x0D3B <= code && code <= 0x0D3C) || (0x0D41 <= code && code <= 0x0D44) || (code == 0x0D4D) || (0x0D62 <= code && code <= 0x0D63) || (code == 0x0DCA) || (0x0DD2 <= code && code <= 0x0DD6) || (code == 0x0E31) || (0x0E34 <= code && code <= 0x0E3A) || (0x0E47 <= code && code <= 0x0E4E) || (code == 0x0EB1) || (0x0EB4 <= code && code <= 0x0EBC) || (0x0EC8 <= code && code <= 0x0ECD) || (0x0F18 <= code && code <= 0x0F19) || (code == 0x0F35) || (code == 0x0F37) || (code == 0x0F39) || (0x0F71 <= code && code <= 0x0F7E) || (0x0F80 <= code && code <= 0x0F84) || (0x0F86 <= code && code <= 0x0F87) || (0x0F8D <= code && code <= 0x0FBC) || (code == 0x0FC6) || (0x102D <= code && code <= 0x1030) || (0x1032 <= code && code <= 0x1037) || (0x1039 <= code && code <= 0x103A) || (0x103D <= code && code <= 0x103E) || (0x1058 <= code && code <= 0x1059) || (0x105E <= code && code <= 0x1060) || (0x1071 <= code && code <= 0x1074) || (code == 0x1082) || (0x1085 <= code && code <= 0x1086) || (code == 0x108D) || (code == 0x109D) || (0x135D <= code && code <= 0x135F) || (0x1712 <= code && code <= 0x1714) || (0x1732 <= code && code <= 0x1734) || (0x1752 <= code && code <= 0x1753) || (0x1772 <= code && code <= 0x1773) || (0x17B4 <= code && code <= 0x17B5) || (0x17B7 <= code && code <= 0x17BD) || (code == 0x17C6) || (0x17C9 <= code && code <= 0x17D3) || (code == 0x17DD) || (0x180B <= code && code <= 0x180D) || (0x1885 <= code && code <= 0x1886) || (code == 0x18A9) || (0x1920 <= code && code <= 0x1922) || (0x1927 <= code && code <= 0x1928) || (code == 0x1932) || (0x1939 <= code && code <= 0x193B) || (0x1A17 <= code && code <= 0x1A18) || (code == 0x1A1B) || (code == 0x1A56) || (0x1A58 <= code && code <= 0x1A60) || (code == 0x1A62) || (0x1A65 <= code && code <= 0x1A6C) || (0x1A73 <= code && code <= 0x1A7F) || (0x1AB0 <= code && code <= 0x1B03) || (code == 0x1B34) || (0x1B36 <= code && code <= 0x1B3A) || (code == 0x1B3C) || (code == 0x1B42) || (0x1B6B <= code && code <= 0x1B73) || (0x1B80 <= code && code <= 0x1B81) || (0x1BA2 <= code && code <= 0x1BA5) || (0x1BA8 <= code && code <= 0x1BA9) || (0x1BAB <= code && code <= 0x1BAD) || (code == 0x1BE6) || (0x1BE8 <= code && code <= 0x1BE9) || (code == 0x1BED) || (0x1BEF <= code && code <= 0x1BF1) || (0x1C2C <= code && code <= 0x1C33) || (0x1C36 <= code && code <= 0x1C37) || (0x1CD0 <= code && code <= 0x1CD2) || (0x1CD4 <= code && code <= 0x1CE0) || (0x1CE2 <= code && code <= 0x1CE8) || (code == 0x1CED) || (code == 0x1CF4) || (0x1CF8 <= code && code <= 0x1CF9) || (0x1DC0 <= code && code <= 0x1DFF) || (0x20D0 <= code && code <= 0x20F0) || (0x2CEF <= code && code <= 0x2CF1) || (code == 0x2D7F) || (0x2DE0 <= code && code <= 0x2DFF) || (0x302A <= code && code <= 0x302D) || (0x3099 <= code && code <= 0x309A) || (0xA66F <= code && code <= 0xA672) || (0xA674 <= code && code <= 0xA67D) || (0xA69E <= code && code <= 0xA69F) || (0xA6F0 <= code && code <= 0xA6F1) || (code == 0xA802) || (code == 0xA806) || (code == 0xA80B) || (0xA825 <= code && code <= 0xA826) || (0xA8C4 <= code && code <= 0xA8C5) || (0xA8E0 <= code && code <= 0xA8F1) || (code == 0xA8FF) || (0xA926 <= code && code <= 0xA92D) || (0xA947 <= code && code <= 0xA951) || (0xA980 <= code && code <= 0xA982) || (code == 0xA9B3) || (0xA9B6 <= code && code <= 0xA9B9) || (0xA9BC <= code && code <= 0xA9BD) || (code == 0xA9E5) || (0xAA29 <= code && code <= 0xAA2E) || (0xAA31 <= code && code <= 0xAA32) || (0xAA35 <= code && code <= 0xAA36) || (code == 0xAA43) || (code == 0xAA4C) || (code == 0xAA7C) || (code == 0xAAB0) || (0xAAB2 <= code && code <= 0xAAB4) || (0xAAB7 <= code && code <= 0xAAB8) || (0xAABE <= code && code <= 0xAABF) || (code == 0xAAC1) || (0xAAEC <= code && code <= 0xAAED) || (code == 0xAAF6) || (code == 0xABE5) || (code == 0xABE8) || (code == 0xABED) || (code == 0xFB1E) || (0xFE00 <= code && code <= 0xFE0F) || (0xFE20 <= code && code <= 0xFE2F) || (code == 0x101FD) || (code == 0x102E0) || (0x10376 <= code && code <= 0x1037A) || (0x10A01 <= code && code <= 0x10A0F) || (0x10A38 <= code && code <= 0x10A3F) || (0x10AE5 <= code && code <= 0x10AE6) || (0x10D24 <= code && code <= 0x10D27) || (0x10F46 <= code && code <= 0x10F50) || (code == 0x11001) || (0x11038 <= code && code <= 0x11046) || (0x1107F <= code && code <= 0x11081) || (0x110B3 <= code && code <= 0x110B6) || (0x110B9 <= code && code <= 0x110BA) || (0x11100 <= code && code <= 0x11102) || (0x11127 <= code && code <= 0x1112B) || (0x1112D <= code && code <= 0x11134) || (code == 0x11173) || (0x11180 <= code && code <= 0x11181) || (0x111B6 <= code && code <= 0x111BE) || (0x111C9 <= code && code <= 0x111CC) || (0x1122F <= code && code <= 0x11231) || (code == 0x11234) || (0x11236 <= code && code <= 0x11237) || (code == 0x1123E) || (code == 0x112DF) || (0x112E3 <= code && code <= 0x112EA) || (0x11300 <= code && code <= 0x11301) || (0x1133B <= code && code <= 0x1133C) || (code == 0x11340) || (0x11366 <= code && code <= 0x11374) || (0x11438 <= code && code <= 0x1143F) || (0x11442 <= code && code <= 0x11444) || (code == 0x11446) || (code == 0x1145E) || (0x114B3 <= code && code <= 0x114B8) || (code == 0x114BA) || (0x114BF <= code && code <= 0x114C0) || (0x114C2 <= code && code <= 0x114C3) || (0x115B2 <= code && code <= 0x115B5) || (0x115BC <= code && code <= 0x115BD) || (0x115BF <= code && code <= 0x115C0) || (0x115DC <= code && code <= 0x115DD) || (0x11633 <= code && code <= 0x1163A) || (code == 0x1163D) || (0x1163F <= code && code <= 0x11640) || (code == 0x116AB) || (code == 0x116AD) || (0x116B0 <= code && code <= 0x116B5) || (code == 0x116B7) || (0x1171D <= code && code <= 0x1171F) || (0x11722 <= code && code <= 0x11725) || (0x11727 <= code && code <= 0x1172B) || (0x1182F <= code && code <= 0x11837) || (0x11839 <= code && code <= 0x1183A) || (0x119D4 <= code && code <= 0x119DB) || (code == 0x119E0) || (0x11A01 <= code && code <= 0x11A06) || (0x11A09 <= code && code <= 0x11A0A) || (0x11A33 <= code && code <= 0x11A38) || (0x11A3B <= code && code <= 0x11A3E) || (code == 0x11A47) || (0x11A51 <= code && code <= 0x11A56) || (0x11A59 <= code && code <= 0x11A5B) || (0x11A8A <= code && code <= 0x11A96) || (0x11A98 <= code && code <= 0x11A99) || (0x11C30 <= code && code <= 0x11C3D) || (0x11C92 <= code && code <= 0x11CA7) || (0x11CAA <= code && code <= 0x11CB0) || (0x11CB2 <= code && code <= 0x11CB3) || (0x11CB5 <= code && code <= 0x11CB6) || (0x11D31 <= code && code <= 0x11D45) || (code == 0x11D47) || (0x11D90 <= code && code <= 0x11D91) || (code == 0x11D95) || (code == 0x11D97) || (0x11EF3 <= code && code <= 0x11EF4) || (0x16AF0 <= code && code <= 0x16AF4) || (0x16B30 <= code && code <= 0x16B36) || (code == 0x16F4F) || (0x16F8F <= code && code <= 0x16F92) || (0x1BC9D <= code && code <= 0x1BC9E) || (0x1D167 <= code && code <= 0x1D169) || (0x1D17B <= code && code <= 0x1D182) || (0x1D185 <= code && code <= 0x1D18B) || (0x1D1AA <= code && code <= 0x1D1AD) || (0x1D242 <= code && code <= 0x1D244) || (0x1DA00 <= code && code <= 0x1DA36) || (0x1DA3B <= code && code <= 0x1DA6C) || (code == 0x1DA75) || (code == 0x1DA84) || (0x1DA9B <= code && code <= 0x1E02A) || (0x1E130 <= code && code <= 0x1E136) || (0x1E2EC <= code && code <= 0x1E2EF) || (0x1E8D0 <= code && code <= 0x1E8D6) || (0x1E944 <= code && code <= 0x1E94A) || (0xE0100 <= code && code <= 0xE01EF); }; 
var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) || (0x0483 <= code && code <= 0x0489) || (0x0591 <= code && code <= 0x05BD) || (code == 0x05BF) || (0x05C1 <= code && code <= 0x05C2) || (0x05C4 <= code && code <= 0x05C5) || (code == 0x05C7) || (0x0610 <= code && code <= 0x061A) || (0x064B <= code && code <= 0x065F) || (code == 0x0670) || (0x06D6 <= code && code <= 0x06DC) || (0x06DF <= code && code <= 0x06E4) || (0x06E7 <= code && code <= 0x06E8) || (0x06EA <= code && code <= 0x06ED) || (code == 0x0711) || (0x0730 <= code && code <= 0x074A) || (0x07A6 <= code && code <= 0x07B0) || (0x07EB <= code && code <= 0x07F3) || (code == 0x07FD) || (0x0816 <= code && code <= 0x0819) || (0x081B <= code && code <= 0x0823) || (0x0825 <= code && code <= 0x0827) || (0x0829 <= code && code <= 0x082D) || (0x0859 <= code && code <= 0x085B) || (0x08D3 <= code && code <= 0x08E1) || (0x08E3 <= code && code <= 0x0902) || (code == 0x093A) || (code == 0x093C) || (0x0941 <= code && code <= 0x0948) || (code == 0x094D) || (0x0951 <= code && code <= 0x0957) || (0x0962 <= code && code <= 0x0963) || (code == 0x0981) || (code == 0x09BC) || (0x09C1 <= code && code <= 0x09C4) || (code == 0x09CD) || (0x09E2 <= code && code <= 0x09E3) || (0x09FE <= code && code <= 0x0A02) || (code == 0x0A3C) || (0x0A41 <= code && code <= 0x0A51) || (0x0A70 <= code && code <= 0x0A71) || (code == 0x0A75) || (0x0A81 <= code && code <= 0x0A82) || (code == 0x0ABC) || (0x0AC1 <= code && code <= 0x0AC8) || (code == 0x0ACD) || (0x0AE2 <= code && code <= 0x0AE3) || (0x0AFA <= code && code <= 0x0B01) || (code == 0x0B3C) || (code == 0x0B3F) || (0x0B41 <= code && code <= 0x0B44) || (0x0B4D <= code && code <= 0x0B56) || (0x0B62 <= code && code <= 0x0B63) || (code == 0x0B82) || (code == 0x0BC0) || (code == 0x0BCD) || (code == 0x0C00) || (code == 0x0C04) || (0x0C3E <= code && code <= 0x0C40) || (0x0C46 <= code && code <= 0x0C56) || (0x0C62 <= code && code <= 0x0C63) || (code == 0x0C81) || (code == 0x0CBC) || (0x0CCC <= code && code <= 0x0CCD) || (0x0CE2 <= code && code <= 0x0CE3) || (0x0D00 <= code && code <= 0x0D01) || (0x0D3B <= code && code <= 0x0D3C) || (0x0D41 <= code && code <= 0x0D44) || (code == 0x0D4D) || (0x0D62 <= code && code <= 0x0D63) || (code == 0x0DCA) || (0x0DD2 <= code && code <= 0x0DD6) || (code == 0x0E31) || (0x0E34 <= code && code <= 0x0E3A) || (0x0E47 <= code && code <= 0x0E4E) || (code == 0x0EB1) || (0x0EB4 <= code && code <= 0x0EBC) || (0x0EC8 <= code && code <= 0x0ECD) || (0x0F18 <= code && code <= 0x0F19) || (code == 0x0F35) || (code == 0x0F37) || (code == 0x0F39) || (0x0F71 <= code && code <= 0x0F7E) || (0x0F80 <= code && code <= 0x0F84) || (0x0F86 <= code && code <= 0x0F87) || (0x0F8D <= code && code <= 0x0FBC) || (code == 0x0FC6) || (0x102D <= code && code <= 0x1030) || (0x1032 <= code && code <= 0x1037) || (0x1039 <= code && code <= 0x103A) || (0x103D <= code && code <= 0x103E) || (0x1058 <= code && code <= 0x1059) || (0x105E <= code && code <= 0x1060) || (0x1071 <= code && code <= 0x1074) || (code == 0x1082) || (0x1085 <= code && code <= 0x1086) || (code == 0x108D) || (code == 0x109D) || (0x135D <= code && code <= 0x135F) || (0x1712 <= code && code <= 0x1714) || (0x1732 <= code && code <= 0x1734) || (0x1752 <= code && code <= 0x1753) || (0x1772 <= code && code <= 0x1773) || (0x17B4 <= code && code <= 0x17B5) || (0x17B7 <= code && code <= 0x17BD) || (code == 0x17C6) || (0x17C9 <= code && code <= 0x17D3) || (code == 0x17DD) || (0x180B <= code && code <= 0x180D) || (0x1885 <= code && code <= 0x1886) || (code == 0x18A9) || (0x1920 <= code && code <= 0x1922) || (0x1927 <= code && code <= 0x1928) || (code == 0x1932) || (0x1939 <= code && code <= 0x193B) || (0x1A17 <= code && code <= 0x1A18) || (code == 0x1A1B) || (code == 0x1A56) || (0x1A58 <= code && code <= 0x1A60) || (code == 0x1A62) || (0x1A65 <= code && code <= 0x1A6C) || (0x1A73 <= code && code <= 0x1A7F) || (0x1AB0 <= code && code <= 0x1B03) || (code == 0x1B34) || (0x1B36 <= code && code <= 0x1B3A) || (code == 0x1B3C) || (code == 0x1B42) || (0x1B6B <= code && code <= 0x1B73) || (0x1B80 <= code && code <= 0x1B81) || (0x1BA2 <= code && code <= 0x1BA5) || (0x1BA8 <= code && code <= 0x1BA9) || (0x1BAB <= code && code <= 0x1BAD) || (code == 0x1BE6) || (0x1BE8 <= code && code <= 0x1BE9) || (code == 0x1BED) || (0x1BEF <= code && code <= 0x1BF1) || (0x1C2C <= code && code <= 0x1C33) || (0x1C36 <= code && code <= 0x1C37) || (0x1CD0 <= code && code <= 0x1CD2) || (0x1CD4 <= code && code <= 0x1CE0) || (0x1CE2 <= code && code <= 0x1CE8) || (code == 0x1CED) || (code == 0x1CF4) || (0x1CF8 <= code && code <= 0x1CF9) || (0x1DC0 <= code && code <= 0x1DFF) || (0x20D0 <= code && code <= 0x20F0) || (0x2CEF <= code && code <= 0x2CF1) || (code == 0x2D7F) || (0x2DE0 <= code && code <= 0x2DFF) || (0x302A <= code && code <= 0x302D) || (0x3099 <= code && code <= 0x309A) || (0xA66F <= code && code <= 0xA672) || (0xA674 <= code && code <= 0xA67D) || (0xA69E <= code && code <= 0xA69F) || (0xA6F0 <= code && code <= 0xA6F1) || (code == 0xA802) || (code == 0xA806) || (code == 0xA80B) || (0xA825 <= code && code <= 0xA826) || (0xA8C4 <= code && code <= 0xA8C5) || (0xA8E0 <= code && code <= 0xA8F1) || (code == 0xA8FF) || (0xA926 <= code && code <= 0xA92D) || (0xA947 <= code && code <= 0xA951) || (0xA980 <= code && code <= 0xA982) || (code == 0xA9B3) || (0xA9B6 <= code && code <= 0xA9B9) || (0xA9BC <= code && code <= 0xA9BD) || (code == 0xA9E5) || (0xAA29 <= code && code <= 0xAA2E) || (0xAA31 <= code && code <= 0xAA32) || (0xAA35 <= code && code <= 0xAA36) || (code == 0xAA43) || (code == 0xAA4C) || (code == 0xAA7C) || (code == 0xAAB0) || (0xAAB2 <= code && code <= 0xAAB4) || (0xAAB7 <= code && code <= 0xAAB8) || (0xAABE <= code && code <= 0xAABF) || (code == 0xAAC1) || (0xAAEC <= code && code <= 0xAAED) || (code == 0xAAF6) || (code == 0xABE5) || (code == 0xABE8) || (code == 0xABED) || (code == 0xFB1E) || (0xFE00 <= code && code <= 0xFE0F) || (0xFE20 <= code && code <= 0xFE2F) || (code == 0x101FD) || (code == 0x102E0) || (0x10376 <= code && code <= 0x1037A) || (0x10A01 <= code && code <= 0x10A0F) || (0x10A38 <= code && code <= 0x10A3F) || (0x10AE5 <= code && code <= 0x10AE6) || (0x10D24 <= code && code <= 0x10D27) || (0x10F46 <= code && code <= 0x10F50) || (code == 0x11001) || (0x11038 <= code && code <= 0x11046) || (0x1107F <= code && code <= 0x11081) || (0x110B3 <= code && code <= 0x110B6) || (0x110B9 <= code && code <= 0x110BA) || (0x11100 <= code && code <= 0x11102) || (0x11127 <= code && code <= 0x1112B) || (0x1112D <= code && code <= 0x11134) || (code == 0x11173) || (0x11180 <= code && code <= 0x11181) || (0x111B6 <= code && code <= 0x111BE) || (0x111C9 <= code && code <= 0x111CC) || (0x1122F <= code && code <= 0x11231) || (code == 0x11234) || (0x11236 <= code && code <= 0x11237) || (code == 0x1123E) || (code == 0x112DF) || (0x112E3 <= code && code <= 0x112EA) || (0x11300 <= code && code <= 0x11301) || (0x1133B <= code && code <= 0x1133C) || (code == 0x11340) || (0x11366 <= code && code <= 0x11374) || (0x11438 <= code && code <= 0x1143F) || (0x11442 <= code && code <= 0x11444) || (code == 0x11446) || (code == 0x1145E) || (0x114B3 <= code && code <= 0x114B8) || (code == 0x114BA) || (0x114BF <= code && code <= 0x114C0) || (0x114C2 <= code && code <= 0x114C3) || (0x115B2 <= code && code <= 0x115B5) || (0x115BC <= code && code <= 0x115BD) || (0x115BF <= code && code <= 0x115C0) || (0x115DC <= code && code <= 0x115DD) || (0x11633 <= code && code <= 0x1163A) || (code == 0x1163D) || (0x1163F <= code && code <= 0x11640) || (code == 0x116AB) || (code == 0x116AD) || (0x116B0 <= code && code <= 0x116B5) || (code == 0x116B7) || (0x1171D <= code && code <= 0x1171F) || (0x11722 <= code && code <= 0x11725) || (0x11727 <= code && code <= 0x1172B) || (0x1182F <= code && code <= 0x11837) || (0x11839 <= code && code <= 0x1183A) || (0x119D4 <= code && code <= 0x119DB) || (code == 0x119E0) || (0x11A01 <= code && code <= 0x11A06) || (0x11A09 <= code && code <= 0x11A0A) || (0x11A33 <= code && code <= 0x11A38) || (0x11A3B <= code && code <= 0x11A3E) || (code == 0x11A47) || (0x11A51 <= code && code <= 0x11A56) || (0x11A59 <= code && code <= 0x11A5B) || (0x11A8A <= code && code <= 0x11A96) || (0x11A98 <= code && code <= 0x11A99) || (0x11C30 <= code && code <= 0x11C3D) || (0x11C92 <= code && code <= 0x11CA7) || (0x11CAA <= code && code <= 0x11CB0) || (0x11CB2 <= code && code <= 0x11CB3) || (0x11CB5 <= code && code <= 0x11CB6) || (0x11D31 <= code && code <= 0x11D45) || (code == 0x11D47) || (0x11D90 <= code && code <= 0x11D91) || (code == 0x11D95) || (code == 0x11D97) || (0x11EF3 <= code && code <= 0x11EF4) || (0x16AF0 <= code && code <= 0x16AF4) || (0x16B30 <= code && code <= 0x16B36) || (code == 0x16F4F) || (0x16F8F <= code && code <= 0x16F92) || (0x1BC9D <= code && code <= 0x1BC9E) || (0x1D167 <= code && code <= 0x1D169) || (0x1D17B <= code && code <= 0x1D182) || (0x1D185 <= code && code <= 0x1D18B) || (0x1D1AA <= code && code <= 0x1D1AD) || (0x1D242 <= code && code <= 0x1D244) || (0x1DA00 <= code && code <= 0x1DA36) || (0x1DA3B <= code && code <= 0x1DA6C) || (code == 0x1DA75) || (code == 0x1DA84) || (0x1DA9B <= code && code <= 0x1E02A) || (0x1E130 <= code && code <= 0x1E136) || (0x1E2EC <= code && code <= 0x1E2EF) || (0x1E8D0 <= code && code <= 0x1E8D6) || (0x1E944 <= code && code <= 0x1E94A) || (0xE0100 <= code && code <= 0xE01EF); }; 

Update 2:

Handling zero-width joiners.

(function(){ var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) // Comb. Diacritical Marks || (0x1AB0 <= code && code <= 0x1AFF) // Comb. Diacritical Marks Extended || (0x1DC0 <= code && code <= 0x1DFF) // Comb. Diacritical Marks Supplement || (0x20D0 <= code && code <= 0x20FF) // Comb. Diacritical Marks for Symbols || (0xFE20 <= code && code <= 0xFE2F); // Comb. Half Marks }; String.prototype.reverse = function() { let output = ""; for ( let i = this.length; i > 0; ) { let width = 0; let has_zero_width_joiner = false; while( i > 0 && isCombiningDiacritic( this.charCodeAt(i-1) ) ) { --i; width++; } do { --i; width++; if ( i > 0 && "\uDC00" <= this[i] && this[i] <= "\uDFFF" && "\uD800" <= this[i-1] && this[i-1] <= "\uDBFF" ) { --i; width++; } has_zero_width_joiner = i > 0 && "\u200D" == this[i-1]; if ( has_zero_width_joiner ) { --i; width++; } } while( i > 0 && has_zero_width_joiner ); output += this.substr( i, width ); } return output; } })(); // Tests [ 'abcdefg', 'ab\u0303c', 'a\uD83C\uDFA5b', 'a\uD83C\uDFA5b\uD83C\uDFA6c', 'a\uD83C\uDFA5b\u0306c\uD83C\uDFA6d', 'TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡', // copied from http://stackoverflow.com/a/1732454/1509264 'What 👨‍👩‍👦 is this?' ].forEach( function(str){ console.log( str + " -> " + str.reverse() ); } );

added 8574 characters in body
Source Link
MT0
  • 172.7k
  • 12
  • 70
  • 136

Update

A more complete list of combining diacritics is:

 var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) || (0x0483 <= code && code <= 0x0489) || (0x0591 <= code && code <= 0x05BD) || (code == 0x05BF) || (0x05C1 <= code && code <= 0x05C2) || (0x05C4 <= code && code <= 0x05C5) || (code == 0x05C7) || (0x0610 <= code && code <= 0x061A) || (0x064B <= code && code <= 0x065F) || (code == 0x0670) || (0x06D6 <= code && code <= 0x06DC) || (0x06DF <= code && code <= 0x06E4) || (0x06E7 <= code && code <= 0x06E8) || (0x06EA <= code && code <= 0x06ED) || (code == 0x0711) || (0x0730 <= code && code <= 0x074A) || (0x07A6 <= code && code <= 0x07B0) || (0x07EB <= code && code <= 0x07F3) || (code == 0x07FD) || (0x0816 <= code && code <= 0x0819) || (0x081B <= code && code <= 0x0823) || (0x0825 <= code && code <= 0x0827) || (0x0829 <= code && code <= 0x082D) || (0x0859 <= code && code <= 0x085B) || (0x08D3 <= code && code <= 0x08E1) || (0x08E3 <= code && code <= 0x0902) || (code == 0x093A) || (code == 0x093C) || (0x0941 <= code && code <= 0x0948) || (code == 0x094D) || (0x0951 <= code && code <= 0x0957) || (0x0962 <= code && code <= 0x0963) || (code == 0x0981) || (code == 0x09BC) || (0x09C1 <= code && code <= 0x09C4) || (code == 0x09CD) || (0x09E2 <= code && code <= 0x09E3) || (0x09FE <= code && code <= 0x0A02) || (code == 0x0A3C) || (0x0A41 <= code && code <= 0x0A51) || (0x0A70 <= code && code <= 0x0A71) || (code == 0x0A75) || (0x0A81 <= code && code <= 0x0A82) || (code == 0x0ABC) || (0x0AC1 <= code && code <= 0x0AC8) || (code == 0x0ACD) || (0x0AE2 <= code && code <= 0x0AE3) || (0x0AFA <= code && code <= 0x0B01) || (code == 0x0B3C) || (code == 0x0B3F) || (0x0B41 <= code && code <= 0x0B44) || (0x0B4D <= code && code <= 0x0B56) || (0x0B62 <= code && code <= 0x0B63) || (code == 0x0B82) || (code == 0x0BC0) || (code == 0x0BCD) || (code == 0x0C00) || (code == 0x0C04) || (0x0C3E <= code && code <= 0x0C40) || (0x0C46 <= code && code <= 0x0C56) || (0x0C62 <= code && code <= 0x0C63) || (code == 0x0C81) || (code == 0x0CBC) || (0x0CCC <= code && code <= 0x0CCD) || (0x0CE2 <= code && code <= 0x0CE3) || (0x0D00 <= code && code <= 0x0D01) || (0x0D3B <= code && code <= 0x0D3C) || (0x0D41 <= code && code <= 0x0D44) || (code == 0x0D4D) || (0x0D62 <= code && code <= 0x0D63) || (code == 0x0DCA) || (0x0DD2 <= code && code <= 0x0DD6) || (code == 0x0E31) || (0x0E34 <= code && code <= 0x0E3A) || (0x0E47 <= code && code <= 0x0E4E) || (code == 0x0EB1) || (0x0EB4 <= code && code <= 0x0EBC) || (0x0EC8 <= code && code <= 0x0ECD) || (0x0F18 <= code && code <= 0x0F19) || (code == 0x0F35) || (code == 0x0F37) || (code == 0x0F39) || (0x0F71 <= code && code <= 0x0F7E) || (0x0F80 <= code && code <= 0x0F84) || (0x0F86 <= code && code <= 0x0F87) || (0x0F8D <= code && code <= 0x0FBC) || (code == 0x0FC6) || (0x102D <= code && code <= 0x1030) || (0x1032 <= code && code <= 0x1037) || (0x1039 <= code && code <= 0x103A) || (0x103D <= code && code <= 0x103E) || (0x1058 <= code && code <= 0x1059) || (0x105E <= code && code <= 0x1060) || (0x1071 <= code && code <= 0x1074) || (code == 0x1082) || (0x1085 <= code && code <= 0x1086) || (code == 0x108D) || (code == 0x109D) || (0x135D <= code && code <= 0x135F) || (0x1712 <= code && code <= 0x1714) || (0x1732 <= code && code <= 0x1734) || (0x1752 <= code && code <= 0x1753) || (0x1772 <= code && code <= 0x1773) || (0x17B4 <= code && code <= 0x17B5) || (0x17B7 <= code && code <= 0x17BD) || (code == 0x17C6) || (0x17C9 <= code && code <= 0x17D3) || (code == 0x17DD) || (0x180B <= code && code <= 0x180D) || (0x1885 <= code && code <= 0x1886) || (code == 0x18A9) || (0x1920 <= code && code <= 0x1922) || (0x1927 <= code && code <= 0x1928) || (code == 0x1932) || (0x1939 <= code && code <= 0x193B) || (0x1A17 <= code && code <= 0x1A18) || (code == 0x1A1B) || (code == 0x1A56) || (0x1A58 <= code && code <= 0x1A60) || (code == 0x1A62) || (0x1A65 <= code && code <= 0x1A6C) || (0x1A73 <= code && code <= 0x1A7F) || (0x1AB0 <= code && code <= 0x1B03) || (code == 0x1B34) || (0x1B36 <= code && code <= 0x1B3A) || (code == 0x1B3C) || (code == 0x1B42) || (0x1B6B <= code && code <= 0x1B73) || (0x1B80 <= code && code <= 0x1B81) || (0x1BA2 <= code && code <= 0x1BA5) || (0x1BA8 <= code && code <= 0x1BA9) || (0x1BAB <= code && code <= 0x1BAD) || (code == 0x1BE6) || (0x1BE8 <= code && code <= 0x1BE9) || (code == 0x1BED) || (0x1BEF <= code && code <= 0x1BF1) || (0x1C2C <= code && code <= 0x1C33) || (0x1C36 <= code && code <= 0x1C37) || (0x1CD0 <= code && code <= 0x1CD2) || (0x1CD4 <= code && code <= 0x1CE0) || (0x1CE2 <= code && code <= 0x1CE8) || (code == 0x1CED) || (code == 0x1CF4) || (0x1CF8 <= code && code <= 0x1CF9) || (0x1DC0 <= code && code <= 0x1DFF) || (0x20D0 <= code && code <= 0x20F0) || (0x2CEF <= code && code <= 0x2CF1) || (code == 0x2D7F) || (0x2DE0 <= code && code <= 0x2DFF) || (0x302A <= code && code <= 0x302D) || (0x3099 <= code && code <= 0x309A) || (0xA66F <= code && code <= 0xA672) || (0xA674 <= code && code <= 0xA67D) || (0xA69E <= code && code <= 0xA69F) || (0xA6F0 <= code && code <= 0xA6F1) || (code == 0xA802) || (code == 0xA806) || (code == 0xA80B) || (0xA825 <= code && code <= 0xA826) || (0xA8C4 <= code && code <= 0xA8C5) || (0xA8E0 <= code && code <= 0xA8F1) || (code == 0xA8FF) || (0xA926 <= code && code <= 0xA92D) || (0xA947 <= code && code <= 0xA951) || (0xA980 <= code && code <= 0xA982) || (code == 0xA9B3) || (0xA9B6 <= code && code <= 0xA9B9) || (0xA9BC <= code && code <= 0xA9BD) || (code == 0xA9E5) || (0xAA29 <= code && code <= 0xAA2E) || (0xAA31 <= code && code <= 0xAA32) || (0xAA35 <= code && code <= 0xAA36) || (code == 0xAA43) || (code == 0xAA4C) || (code == 0xAA7C) || (code == 0xAAB0) || (0xAAB2 <= code && code <= 0xAAB4) || (0xAAB7 <= code && code <= 0xAAB8) || (0xAABE <= code && code <= 0xAABF) || (code == 0xAAC1) || (0xAAEC <= code && code <= 0xAAED) || (code == 0xAAF6) || (code == 0xABE5) || (code == 0xABE8) || (code == 0xABED) || (code == 0xFB1E) || (0xFE00 <= code && code <= 0xFE0F) || (0xFE20 <= code && code <= 0xFE2F) || (code == 0x101FD) || (code == 0x102E0) || (0x10376 <= code && code <= 0x1037A) || (0x10A01 <= code && code <= 0x10A0F) || (0x10A38 <= code && code <= 0x10A3F) || (0x10AE5 <= code && code <= 0x10AE6) || (0x10D24 <= code && code <= 0x10D27) || (0x10F46 <= code && code <= 0x10F50) || (code == 0x11001) || (0x11038 <= code && code <= 0x11046) || (0x1107F <= code && code <= 0x11081) || (0x110B3 <= code && code <= 0x110B6) || (0x110B9 <= code && code <= 0x110BA) || (0x11100 <= code && code <= 0x11102) || (0x11127 <= code && code <= 0x1112B) || (0x1112D <= code && code <= 0x11134) || (code == 0x11173) || (0x11180 <= code && code <= 0x11181) || (0x111B6 <= code && code <= 0x111BE) || (0x111C9 <= code && code <= 0x111CC) || (0x1122F <= code && code <= 0x11231) || (code == 0x11234) || (0x11236 <= code && code <= 0x11237) || (code == 0x1123E) || (code == 0x112DF) || (0x112E3 <= code && code <= 0x112EA) || (0x11300 <= code && code <= 0x11301) || (0x1133B <= code && code <= 0x1133C) || (code == 0x11340) || (0x11366 <= code && code <= 0x11374) || (0x11438 <= code && code <= 0x1143F) || (0x11442 <= code && code <= 0x11444) || (code == 0x11446) || (code == 0x1145E) || (0x114B3 <= code && code <= 0x114B8) || (code == 0x114BA) || (0x114BF <= code && code <= 0x114C0) || (0x114C2 <= code && code <= 0x114C3) || (0x115B2 <= code && code <= 0x115B5) || (0x115BC <= code && code <= 0x115BD) || (0x115BF <= code && code <= 0x115C0) || (0x115DC <= code && code <= 0x115DD) || (0x11633 <= code && code <= 0x1163A) || (code == 0x1163D) || (0x1163F <= code && code <= 0x11640) || (code == 0x116AB) || (code == 0x116AD) || (0x116B0 <= code && code <= 0x116B5) || (code == 0x116B7) || (0x1171D <= code && code <= 0x1171F) || (0x11722 <= code && code <= 0x11725) || (0x11727 <= code && code <= 0x1172B) || (0x1182F <= code && code <= 0x11837) || (0x11839 <= code && code <= 0x1183A) || (0x119D4 <= code && code <= 0x119DB) || (code == 0x119E0) || (0x11A01 <= code && code <= 0x11A06) || (0x11A09 <= code && code <= 0x11A0A) || (0x11A33 <= code && code <= 0x11A38) || (0x11A3B <= code && code <= 0x11A3E) || (code == 0x11A47) || (0x11A51 <= code && code <= 0x11A56) || (0x11A59 <= code && code <= 0x11A5B) || (0x11A8A <= code && code <= 0x11A96) || (0x11A98 <= code && code <= 0x11A99) || (0x11C30 <= code && code <= 0x11C3D) || (0x11C92 <= code && code <= 0x11CA7) || (0x11CAA <= code && code <= 0x11CB0) || (0x11CB2 <= code && code <= 0x11CB3) || (0x11CB5 <= code && code <= 0x11CB6) || (0x11D31 <= code && code <= 0x11D45) || (code == 0x11D47) || (0x11D90 <= code && code <= 0x11D91) || (code == 0x11D95) || (code == 0x11D97) || (0x11EF3 <= code && code <= 0x11EF4) || (0x16AF0 <= code && code <= 0x16AF4) || (0x16B30 <= code && code <= 0x16B36) || (code == 0x16F4F) || (0x16F8F <= code && code <= 0x16F92) || (0x1BC9D <= code && code <= 0x1BC9E) || (0x1D167 <= code && code <= 0x1D169) || (0x1D17B <= code && code <= 0x1D182) || (0x1D185 <= code && code <= 0x1D18B) || (0x1D1AA <= code && code <= 0x1D1AD) || (0x1D242 <= code && code <= 0x1D244) || (0x1DA00 <= code && code <= 0x1DA36) || (0x1DA3B <= code && code <= 0x1DA6C) || (code == 0x1DA75) || (code == 0x1DA84) || (0x1DA9B <= code && code <= 0x1E02A) || (0x1E130 <= code && code <= 0x1E136) || (0x1E2EC <= code && code <= 0x1E2EF) || (0x1E8D0 <= code && code <= 0x1E8D6) || (0x1E944 <= code && code <= 0x1E94A) || (0xE0100 <= code && code <= 0xE01EF); }; 

Update

A more complete list of combining diacritics is:

 var isCombiningDiacritic = function( code ) { return (0x0300 <= code && code <= 0x036F) || (0x0483 <= code && code <= 0x0489) || (0x0591 <= code && code <= 0x05BD) || (code == 0x05BF) || (0x05C1 <= code && code <= 0x05C2) || (0x05C4 <= code && code <= 0x05C5) || (code == 0x05C7) || (0x0610 <= code && code <= 0x061A) || (0x064B <= code && code <= 0x065F) || (code == 0x0670) || (0x06D6 <= code && code <= 0x06DC) || (0x06DF <= code && code <= 0x06E4) || (0x06E7 <= code && code <= 0x06E8) || (0x06EA <= code && code <= 0x06ED) || (code == 0x0711) || (0x0730 <= code && code <= 0x074A) || (0x07A6 <= code && code <= 0x07B0) || (0x07EB <= code && code <= 0x07F3) || (code == 0x07FD) || (0x0816 <= code && code <= 0x0819) || (0x081B <= code && code <= 0x0823) || (0x0825 <= code && code <= 0x0827) || (0x0829 <= code && code <= 0x082D) || (0x0859 <= code && code <= 0x085B) || (0x08D3 <= code && code <= 0x08E1) || (0x08E3 <= code && code <= 0x0902) || (code == 0x093A) || (code == 0x093C) || (0x0941 <= code && code <= 0x0948) || (code == 0x094D) || (0x0951 <= code && code <= 0x0957) || (0x0962 <= code && code <= 0x0963) || (code == 0x0981) || (code == 0x09BC) || (0x09C1 <= code && code <= 0x09C4) || (code == 0x09CD) || (0x09E2 <= code && code <= 0x09E3) || (0x09FE <= code && code <= 0x0A02) || (code == 0x0A3C) || (0x0A41 <= code && code <= 0x0A51) || (0x0A70 <= code && code <= 0x0A71) || (code == 0x0A75) || (0x0A81 <= code && code <= 0x0A82) || (code == 0x0ABC) || (0x0AC1 <= code && code <= 0x0AC8) || (code == 0x0ACD) || (0x0AE2 <= code && code <= 0x0AE3) || (0x0AFA <= code && code <= 0x0B01) || (code == 0x0B3C) || (code == 0x0B3F) || (0x0B41 <= code && code <= 0x0B44) || (0x0B4D <= code && code <= 0x0B56) || (0x0B62 <= code && code <= 0x0B63) || (code == 0x0B82) || (code == 0x0BC0) || (code == 0x0BCD) || (code == 0x0C00) || (code == 0x0C04) || (0x0C3E <= code && code <= 0x0C40) || (0x0C46 <= code && code <= 0x0C56) || (0x0C62 <= code && code <= 0x0C63) || (code == 0x0C81) || (code == 0x0CBC) || (0x0CCC <= code && code <= 0x0CCD) || (0x0CE2 <= code && code <= 0x0CE3) || (0x0D00 <= code && code <= 0x0D01) || (0x0D3B <= code && code <= 0x0D3C) || (0x0D41 <= code && code <= 0x0D44) || (code == 0x0D4D) || (0x0D62 <= code && code <= 0x0D63) || (code == 0x0DCA) || (0x0DD2 <= code && code <= 0x0DD6) || (code == 0x0E31) || (0x0E34 <= code && code <= 0x0E3A) || (0x0E47 <= code && code <= 0x0E4E) || (code == 0x0EB1) || (0x0EB4 <= code && code <= 0x0EBC) || (0x0EC8 <= code && code <= 0x0ECD) || (0x0F18 <= code && code <= 0x0F19) || (code == 0x0F35) || (code == 0x0F37) || (code == 0x0F39) || (0x0F71 <= code && code <= 0x0F7E) || (0x0F80 <= code && code <= 0x0F84) || (0x0F86 <= code && code <= 0x0F87) || (0x0F8D <= code && code <= 0x0FBC) || (code == 0x0FC6) || (0x102D <= code && code <= 0x1030) || (0x1032 <= code && code <= 0x1037) || (0x1039 <= code && code <= 0x103A) || (0x103D <= code && code <= 0x103E) || (0x1058 <= code && code <= 0x1059) || (0x105E <= code && code <= 0x1060) || (0x1071 <= code && code <= 0x1074) || (code == 0x1082) || (0x1085 <= code && code <= 0x1086) || (code == 0x108D) || (code == 0x109D) || (0x135D <= code && code <= 0x135F) || (0x1712 <= code && code <= 0x1714) || (0x1732 <= code && code <= 0x1734) || (0x1752 <= code && code <= 0x1753) || (0x1772 <= code && code <= 0x1773) || (0x17B4 <= code && code <= 0x17B5) || (0x17B7 <= code && code <= 0x17BD) || (code == 0x17C6) || (0x17C9 <= code && code <= 0x17D3) || (code == 0x17DD) || (0x180B <= code && code <= 0x180D) || (0x1885 <= code && code <= 0x1886) || (code == 0x18A9) || (0x1920 <= code && code <= 0x1922) || (0x1927 <= code && code <= 0x1928) || (code == 0x1932) || (0x1939 <= code && code <= 0x193B) || (0x1A17 <= code && code <= 0x1A18) || (code == 0x1A1B) || (code == 0x1A56) || (0x1A58 <= code && code <= 0x1A60) || (code == 0x1A62) || (0x1A65 <= code && code <= 0x1A6C) || (0x1A73 <= code && code <= 0x1A7F) || (0x1AB0 <= code && code <= 0x1B03) || (code == 0x1B34) || (0x1B36 <= code && code <= 0x1B3A) || (code == 0x1B3C) || (code == 0x1B42) || (0x1B6B <= code && code <= 0x1B73) || (0x1B80 <= code && code <= 0x1B81) || (0x1BA2 <= code && code <= 0x1BA5) || (0x1BA8 <= code && code <= 0x1BA9) || (0x1BAB <= code && code <= 0x1BAD) || (code == 0x1BE6) || (0x1BE8 <= code && code <= 0x1BE9) || (code == 0x1BED) || (0x1BEF <= code && code <= 0x1BF1) || (0x1C2C <= code && code <= 0x1C33) || (0x1C36 <= code && code <= 0x1C37) || (0x1CD0 <= code && code <= 0x1CD2) || (0x1CD4 <= code && code <= 0x1CE0) || (0x1CE2 <= code && code <= 0x1CE8) || (code == 0x1CED) || (code == 0x1CF4) || (0x1CF8 <= code && code <= 0x1CF9) || (0x1DC0 <= code && code <= 0x1DFF) || (0x20D0 <= code && code <= 0x20F0) || (0x2CEF <= code && code <= 0x2CF1) || (code == 0x2D7F) || (0x2DE0 <= code && code <= 0x2DFF) || (0x302A <= code && code <= 0x302D) || (0x3099 <= code && code <= 0x309A) || (0xA66F <= code && code <= 0xA672) || (0xA674 <= code && code <= 0xA67D) || (0xA69E <= code && code <= 0xA69F) || (0xA6F0 <= code && code <= 0xA6F1) || (code == 0xA802) || (code == 0xA806) || (code == 0xA80B) || (0xA825 <= code && code <= 0xA826) || (0xA8C4 <= code && code <= 0xA8C5) || (0xA8E0 <= code && code <= 0xA8F1) || (code == 0xA8FF) || (0xA926 <= code && code <= 0xA92D) || (0xA947 <= code && code <= 0xA951) || (0xA980 <= code && code <= 0xA982) || (code == 0xA9B3) || (0xA9B6 <= code && code <= 0xA9B9) || (0xA9BC <= code && code <= 0xA9BD) || (code == 0xA9E5) || (0xAA29 <= code && code <= 0xAA2E) || (0xAA31 <= code && code <= 0xAA32) || (0xAA35 <= code && code <= 0xAA36) || (code == 0xAA43) || (code == 0xAA4C) || (code == 0xAA7C) || (code == 0xAAB0) || (0xAAB2 <= code && code <= 0xAAB4) || (0xAAB7 <= code && code <= 0xAAB8) || (0xAABE <= code && code <= 0xAABF) || (code == 0xAAC1) || (0xAAEC <= code && code <= 0xAAED) || (code == 0xAAF6) || (code == 0xABE5) || (code == 0xABE8) || (code == 0xABED) || (code == 0xFB1E) || (0xFE00 <= code && code <= 0xFE0F) || (0xFE20 <= code && code <= 0xFE2F) || (code == 0x101FD) || (code == 0x102E0) || (0x10376 <= code && code <= 0x1037A) || (0x10A01 <= code && code <= 0x10A0F) || (0x10A38 <= code && code <= 0x10A3F) || (0x10AE5 <= code && code <= 0x10AE6) || (0x10D24 <= code && code <= 0x10D27) || (0x10F46 <= code && code <= 0x10F50) || (code == 0x11001) || (0x11038 <= code && code <= 0x11046) || (0x1107F <= code && code <= 0x11081) || (0x110B3 <= code && code <= 0x110B6) || (0x110B9 <= code && code <= 0x110BA) || (0x11100 <= code && code <= 0x11102) || (0x11127 <= code && code <= 0x1112B) || (0x1112D <= code && code <= 0x11134) || (code == 0x11173) || (0x11180 <= code && code <= 0x11181) || (0x111B6 <= code && code <= 0x111BE) || (0x111C9 <= code && code <= 0x111CC) || (0x1122F <= code && code <= 0x11231) || (code == 0x11234) || (0x11236 <= code && code <= 0x11237) || (code == 0x1123E) || (code == 0x112DF) || (0x112E3 <= code && code <= 0x112EA) || (0x11300 <= code && code <= 0x11301) || (0x1133B <= code && code <= 0x1133C) || (code == 0x11340) || (0x11366 <= code && code <= 0x11374) || (0x11438 <= code && code <= 0x1143F) || (0x11442 <= code && code <= 0x11444) || (code == 0x11446) || (code == 0x1145E) || (0x114B3 <= code && code <= 0x114B8) || (code == 0x114BA) || (0x114BF <= code && code <= 0x114C0) || (0x114C2 <= code && code <= 0x114C3) || (0x115B2 <= code && code <= 0x115B5) || (0x115BC <= code && code <= 0x115BD) || (0x115BF <= code && code <= 0x115C0) || (0x115DC <= code && code <= 0x115DD) || (0x11633 <= code && code <= 0x1163A) || (code == 0x1163D) || (0x1163F <= code && code <= 0x11640) || (code == 0x116AB) || (code == 0x116AD) || (0x116B0 <= code && code <= 0x116B5) || (code == 0x116B7) || (0x1171D <= code && code <= 0x1171F) || (0x11722 <= code && code <= 0x11725) || (0x11727 <= code && code <= 0x1172B) || (0x1182F <= code && code <= 0x11837) || (0x11839 <= code && code <= 0x1183A) || (0x119D4 <= code && code <= 0x119DB) || (code == 0x119E0) || (0x11A01 <= code && code <= 0x11A06) || (0x11A09 <= code && code <= 0x11A0A) || (0x11A33 <= code && code <= 0x11A38) || (0x11A3B <= code && code <= 0x11A3E) || (code == 0x11A47) || (0x11A51 <= code && code <= 0x11A56) || (0x11A59 <= code && code <= 0x11A5B) || (0x11A8A <= code && code <= 0x11A96) || (0x11A98 <= code && code <= 0x11A99) || (0x11C30 <= code && code <= 0x11C3D) || (0x11C92 <= code && code <= 0x11CA7) || (0x11CAA <= code && code <= 0x11CB0) || (0x11CB2 <= code && code <= 0x11CB3) || (0x11CB5 <= code && code <= 0x11CB6) || (0x11D31 <= code && code <= 0x11D45) || (code == 0x11D47) || (0x11D90 <= code && code <= 0x11D91) || (code == 0x11D95) || (code == 0x11D97) || (0x11EF3 <= code && code <= 0x11EF4) || (0x16AF0 <= code && code <= 0x16AF4) || (0x16B30 <= code && code <= 0x16B36) || (code == 0x16F4F) || (0x16F8F <= code && code <= 0x16F92) || (0x1BC9D <= code && code <= 0x1BC9E) || (0x1D167 <= code && code <= 0x1D169) || (0x1D17B <= code && code <= 0x1D182) || (0x1D185 <= code && code <= 0x1D18B) || (0x1D1AA <= code && code <= 0x1D1AD) || (0x1D242 <= code && code <= 0x1D244) || (0x1DA00 <= code && code <= 0x1DA36) || (0x1DA3B <= code && code <= 0x1DA6C) || (code == 0x1DA75) || (code == 0x1DA84) || (0x1DA9B <= code && code <= 0x1E02A) || (0x1E130 <= code && code <= 0x1E136) || (0x1E2EC <= code && code <= 0x1E2EF) || (0x1E8D0 <= code && code <= 0x1E8D6) || (0x1E944 <= code && code <= 0x1E94A) || (0xE0100 <= code && code <= 0xE01EF); }; 
added 100 characters in body
Source Link
MT0
  • 172.7k
  • 12
  • 70
  • 136
Loading
Source Link
MT0
  • 172.7k
  • 12
  • 70
  • 136
Loading