For a poor man\'s implementation of near-collation-correct sorting on the client side I need a JavaScript function that does efficient single character rep
For the lads using TypeScript and those who don't want to deal with string prototypes, here is a typescript version of Ed.'s answer:
// Usage example:
"Some string".replace(/[^a-zA-Z0-9-_]/g, char => ToLatinMap.get(char) || '')
// Map:
export let ToLatinMap: Map = new Map([
["Á", "A"],
["Ă", "A"],
["Ắ", "A"],
["Ặ", "A"],
["Ằ", "A"],
["Ẳ", "A"],
["Ẵ", "A"],
["Ǎ", "A"],
["Â", "A"],
["Ấ", "A"],
["Ậ", "A"],
["Ầ", "A"],
["Ẩ", "A"],
["Ẫ", "A"],
["Ä", "A"],
["Ǟ", "A"],
["Ȧ", "A"],
["Ǡ", "A"],
["Ạ", "A"],
["Ȁ", "A"],
["À", "A"],
["Ả", "A"],
["Ȃ", "A"],
["Ā", "A"],
["Ą", "A"],
["Å", "A"],
["Ǻ", "A"],
["Ḁ", "A"],
["Ⱥ", "A"],
["Ã", "A"],
["Ꜳ", "AA"],
["Æ", "AE"],
["Ǽ", "AE"],
["Ǣ", "AE"],
["Ꜵ", "AO"],
["Ꜷ", "AU"],
["Ꜹ", "AV"],
["Ꜻ", "AV"],
["Ꜽ", "AY"],
["Ḃ", "B"],
["Ḅ", "B"],
["Ɓ", "B"],
["Ḇ", "B"],
["Ƀ", "B"],
["Ƃ", "B"],
["Ć", "C"],
["Č", "C"],
["Ç", "C"],
["Ḉ", "C"],
["Ĉ", "C"],
["Ċ", "C"],
["Ƈ", "C"],
["Ȼ", "C"],
["Ď", "D"],
["Ḑ", "D"],
["Ḓ", "D"],
["Ḋ", "D"],
["Ḍ", "D"],
["Ɗ", "D"],
["Ḏ", "D"],
["Dz", "D"],
["Dž", "D"],
["Đ", "D"],
["Ƌ", "D"],
["DZ", "DZ"],
["DŽ", "DZ"],
["É", "E"],
["Ĕ", "E"],
["Ě", "E"],
["Ȩ", "E"],
["Ḝ", "E"],
["Ê", "E"],
["Ế", "E"],
["Ệ", "E"],
["Ề", "E"],
["Ể", "E"],
["Ễ", "E"],
["Ḙ", "E"],
["Ë", "E"],
["Ė", "E"],
["Ẹ", "E"],
["Ȅ", "E"],
["È", "E"],
["Ẻ", "E"],
["Ȇ", "E"],
["Ē", "E"],
["Ḗ", "E"],
["Ḕ", "E"],
["Ę", "E"],
["Ɇ", "E"],
["Ẽ", "E"],
["Ḛ", "E"],
["Ꝫ", "ET"],
["Ḟ", "F"],
["Ƒ", "F"],
["Ǵ", "G"],
["Ğ", "G"],
["Ǧ", "G"],
["Ģ", "G"],
["Ĝ", "G"],
["Ġ", "G"],
["Ɠ", "G"],
["Ḡ", "G"],
["Ǥ", "G"],
["Ḫ", "H"],
["Ȟ", "H"],
["Ḩ", "H"],
["Ĥ", "H"],
["Ⱨ", "H"],
["Ḧ", "H"],
["Ḣ", "H"],
["Ḥ", "H"],
["Ħ", "H"],
["Í", "I"],
["Ĭ", "I"],
["Ǐ", "I"],
["Î", "I"],
["Ï", "I"],
["Ḯ", "I"],
["İ", "I"],
["Ị", "I"],
["Ȉ", "I"],
["Ì", "I"],
["Ỉ", "I"],
["Ȋ", "I"],
["Ī", "I"],
["Į", "I"],
["Ɨ", "I"],
["Ĩ", "I"],
["Ḭ", "I"],
["Ꝺ", "D"],
["Ꝼ", "F"],
["Ᵹ", "G"],
["Ꞃ", "R"],
["Ꞅ", "S"],
["Ꞇ", "T"],
["Ꝭ", "IS"],
["Ĵ", "J"],
["Ɉ", "J"],
["Ḱ", "K"],
["Ǩ", "K"],
["Ķ", "K"],
["Ⱪ", "K"],
["Ꝃ", "K"],
["Ḳ", "K"],
["Ƙ", "K"],
["Ḵ", "K"],
["Ꝁ", "K"],
["Ꝅ", "K"],
["Ĺ", "L"],
["Ƚ", "L"],
["Ľ", "L"],
["Ļ", "L"],
["Ḽ", "L"],
["Ḷ", "L"],
["Ḹ", "L"],
["Ⱡ", "L"],
["Ꝉ", "L"],
["Ḻ", "L"],
["Ŀ", "L"],
["Ɫ", "L"],
["Lj", "L"],
["Ł", "L"],
["LJ", "LJ"],
["Ḿ", "M"],
["Ṁ", "M"],
["Ṃ", "M"],
["Ɱ", "M"],
["Ń", "N"],
["Ň", "N"],
["Ņ", "N"],
["Ṋ", "N"],
["Ṅ", "N"],
["Ṇ", "N"],
["Ǹ", "N"],
["Ɲ", "N"],
["Ṉ", "N"],
["Ƞ", "N"],
["Nj", "N"],
["Ñ", "N"],
["NJ", "NJ"],
["Ó", "O"],
["Ŏ", "O"],
["Ǒ", "O"],
["Ô", "O"],
["Ố", "O"],
["Ộ", "O"],
["Ồ", "O"],
["Ổ", "O"],
["Ỗ", "O"],
["Ö", "O"],
["Ȫ", "O"],
["Ȯ", "O"],
["Ȱ", "O"],
["Ọ", "O"],
["Ő", "O"],
["Ȍ", "O"],
["Ò", "O"],
["Ỏ", "O"],
["Ơ", "O"],
["Ớ", "O"],
["Ợ", "O"],
["Ờ", "O"],
["Ở", "O"],
["Ỡ", "O"],
["Ȏ", "O"],
["Ꝋ", "O"],
["Ꝍ", "O"],
["Ō", "O"],
["Ṓ", "O"],
["Ṑ", "O"],
["Ɵ", "O"],
["Ǫ", "O"],
["Ǭ", "O"],
["Ø", "O"],
["Ǿ", "O"],
["Õ", "O"],
["Ṍ", "O"],
["Ṏ", "O"],
["Ȭ", "O"],
["Ƣ", "OI"],
["Ꝏ", "OO"],
["Ɛ", "E"],
["Ɔ", "O"],
["Ȣ", "OU"],
["Ṕ", "P"],
["Ṗ", "P"],
["Ꝓ", "P"],
["Ƥ", "P"],
["Ꝕ", "P"],
["Ᵽ", "P"],
["Ꝑ", "P"],
["Ꝙ", "Q"],
["Ꝗ", "Q"],
["Ŕ", "R"],
["Ř", "R"],
["Ŗ", "R"],
["Ṙ", "R"],
["Ṛ", "R"],
["Ṝ", "R"],
["Ȑ", "R"],
["Ȓ", "R"],
["Ṟ", "R"],
["Ɍ", "R"],
["Ɽ", "R"],
["Ꜿ", "C"],
["Ǝ", "E"],
["Ś", "S"],
["Ṥ", "S"],
["Š", "S"],
["Ṧ", "S"],
["Ş", "S"],
["Ŝ", "S"],
["Ș", "S"],
["Ṡ", "S"],
["Ṣ", "S"],
["Ṩ", "S"],
["Ť", "T"],
["Ţ", "T"],
["Ṱ", "T"],
["Ț", "T"],
["Ⱦ", "T"],
["Ṫ", "T"],
["Ṭ", "T"],
["Ƭ", "T"],
["Ṯ", "T"],
["Ʈ", "T"],
["Ŧ", "T"],
["Ɐ", "A"],
["Ꞁ", "L"],
["Ɯ", "M"],
["Ʌ", "V"],
["Ꜩ", "TZ"],
["Ú", "U"],
["Ŭ", "U"],
["Ǔ", "U"],
["Û", "U"],
["Ṷ", "U"],
["Ü", "U"],
["Ǘ", "U"],
["Ǚ", "U"],
["Ǜ", "U"],
["Ǖ", "U"],
["Ṳ", "U"],
["Ụ", "U"],
["Ű", "U"],
["Ȕ", "U"],
["Ù", "U"],
["Ủ", "U"],
["Ư", "U"],
["Ứ", "U"],
["Ự", "U"],
["Ừ", "U"],
["Ử", "U"],
["Ữ", "U"],
["Ȗ", "U"],
["Ū", "U"],
["Ṻ", "U"],
["Ų", "U"],
["Ů", "U"],
["Ũ", "U"],
["Ṹ", "U"],
["Ṵ", "U"],
["Ꝟ", "V"],
["Ṿ", "V"],
["Ʋ", "V"],
["Ṽ", "V"],
["Ꝡ", "VY"],
["Ẃ", "W"],
["Ŵ", "W"],
["Ẅ", "W"],
["Ẇ", "W"],
["Ẉ", "W"],
["Ẁ", "W"],
["Ⱳ", "W"],
["Ẍ", "X"],
["Ẋ", "X"],
["Ý", "Y"],
["Ŷ", "Y"],
["Ÿ", "Y"],
["Ẏ", "Y"],
["Ỵ", "Y"],
["Ỳ", "Y"],
["Ƴ", "Y"],
["Ỷ", "Y"],
["Ỿ", "Y"],
["Ȳ", "Y"],
["Ɏ", "Y"],
["Ỹ", "Y"],
["Ź", "Z"],
["Ž", "Z"],
["Ẑ", "Z"],
["Ⱬ", "Z"],
["Ż", "Z"],
["Ẓ", "Z"],
["Ȥ", "Z"],
["Ẕ", "Z"],
["Ƶ", "Z"],
["IJ", "IJ"],
["Œ", "OE"],
["ᴀ", "A"],
["ᴁ", "AE"],
["ʙ", "B"],
["ᴃ", "B"],
["ᴄ", "C"],
["ᴅ", "D"],
["ᴇ", "E"],
["ꜰ", "F"],
["ɢ", "G"],
["ʛ", "G"],
["ʜ", "H"],
["ɪ", "I"],
["ʁ", "R"],
["ᴊ", "J"],
["ᴋ", "K"],
["ʟ", "L"],
["ᴌ", "L"],
["ᴍ", "M"],
["ɴ", "N"],
["ᴏ", "O"],
["ɶ", "OE"],
["ᴐ", "O"],
["ᴕ", "OU"],
["ᴘ", "P"],
["ʀ", "R"],
["ᴎ", "N"],
["ᴙ", "R"],
["ꜱ", "S"],
["ᴛ", "T"],
["ⱻ", "E"],
["ᴚ", "R"],
["ᴜ", "U"],
["ᴠ", "V"],
["ᴡ", "W"],
["ʏ", "Y"],
["ᴢ", "Z"],
["á", "a"],
["ă", "a"],
["ắ", "a"],
["ặ", "a"],
["ằ", "a"],
["ẳ", "a"],
["ẵ", "a"],
["ǎ", "a"],
["â", "a"],
["ấ", "a"],
["ậ", "a"],
["ầ", "a"],
["ẩ", "a"],
["ẫ", "a"],
["ä", "a"],
["ǟ", "a"],
["ȧ", "a"],
["ǡ", "a"],
["ạ", "a"],
["ȁ", "a"],
["à", "a"],
["ả", "a"],
["ȃ", "a"],
["ā", "a"],
["ą", "a"],
["ᶏ", "a"],
["ẚ", "a"],
["å", "a"],
["ǻ", "a"],
["ḁ", "a"],
["ⱥ", "a"],
["ã", "a"],
["ꜳ", "aa"],
["æ", "ae"],
["ǽ", "ae"],
["ǣ", "ae"],
["ꜵ", "ao"],
["ꜷ", "au"],
["ꜹ", "av"],
["ꜻ", "av"],
["ꜽ", "ay"],
["ḃ", "b"],
["ḅ", "b"],
["ɓ", "b"],
["ḇ", "b"],
["ᵬ", "b"],
["ᶀ", "b"],
["ƀ", "b"],
["ƃ", "b"],
["ɵ", "o"],
["ć", "c"],
["č", "c"],
["ç", "c"],
["ḉ", "c"],
["ĉ", "c"],
["ɕ", "c"],
["ċ", "c"],
["ƈ", "c"],
["ȼ", "c"],
["ď", "d"],
["ḑ", "d"],
["ḓ", "d"],
["ȡ", "d"],
["ḋ", "d"],
["ḍ", "d"],
["ɗ", "d"],
["ᶑ", "d"],
["ḏ", "d"],
["ᵭ", "d"],
["ᶁ", "d"],
["đ", "d"],
["ɖ", "d"],
["ƌ", "d"],
["ı", "i"],
["ȷ", "j"],
["ɟ", "j"],
["ʄ", "j"],
["dz", "dz"],
["dž", "dz"],
["é", "e"],
["ĕ", "e"],
["ě", "e"],
["ȩ", "e"],
["ḝ", "e"],
["ê", "e"],
["ế", "e"],
["ệ", "e"],
["ề", "e"],
["ể", "e"],
["ễ", "e"],
["ḙ", "e"],
["ë", "e"],
["ė", "e"],
["ẹ", "e"],
["ȅ", "e"],
["è", "e"],
["ẻ", "e"],
["ȇ", "e"],
["ē", "e"],
["ḗ", "e"],
["ḕ", "e"],
["ⱸ", "e"],
["ę", "e"],
["ᶒ", "e"],
["ɇ", "e"],
["ẽ", "e"],
["ḛ", "e"],
["ꝫ", "et"],
["ḟ", "f"],
["ƒ", "f"],
["ᵮ", "f"],
["ᶂ", "f"],
["ǵ", "g"],
["ğ", "g"],
["ǧ", "g"],
["ģ", "g"],
["ĝ", "g"],
["ġ", "g"],
["ɠ", "g"],
["ḡ", "g"],
["ᶃ", "g"],
["ǥ", "g"],
["ḫ", "h"],
["ȟ", "h"],
["ḩ", "h"],
["ĥ", "h"],
["ⱨ", "h"],
["ḧ", "h"],
["ḣ", "h"],
["ḥ", "h"],
["ɦ", "h"],
["ẖ", "h"],
["ħ", "h"],
["ƕ", "hv"],
["í", "i"],
["ĭ", "i"],
["ǐ", "i"],
["î", "i"],
["ï", "i"],
["ḯ", "i"],
["ị", "i"],
["ȉ", "i"],
["ì", "i"],
["ỉ", "i"],
["ȋ", "i"],
["ī", "i"],
["į", "i"],
["ᶖ", "i"],
["ɨ", "i"],
["ĩ", "i"],
["ḭ", "i"],
["ꝺ", "d"],
["ꝼ", "f"],
["ᵹ", "g"],
["ꞃ", "r"],
["ꞅ", "s"],
["ꞇ", "t"],
["ꝭ", "is"],
["ǰ", "j"],
["ĵ", "j"],
["ʝ", "j"],
["ɉ", "j"],
["ḱ", "k"],
["ǩ", "k"],
["ķ", "k"],
["ⱪ", "k"],
["ꝃ", "k"],
["ḳ", "k"],
["ƙ", "k"],
["ḵ", "k"],
["ᶄ", "k"],
["ꝁ", "k"],
["ꝅ", "k"],
["ĺ", "l"],
["ƚ", "l"],
["ɬ", "l"],
["ľ", "l"],
["ļ", "l"],
["ḽ", "l"],
["ȴ", "l"],
["ḷ", "l"],
["ḹ", "l"],
["ⱡ", "l"],
["ꝉ", "l"],
["ḻ", "l"],
["ŀ", "l"],
["ɫ", "l"],
["ᶅ", "l"],
["ɭ", "l"],
["ł", "l"],
["lj", "lj"],
["ſ", "s"],
["ẜ", "s"],
["ẛ", "s"],
["ẝ", "s"],
["ḿ", "m"],
["ṁ", "m"],
["ṃ", "m"],
["ɱ", "m"],
["ᵯ", "m"],
["ᶆ", "m"],
["ń", "n"],
["ň", "n"],
["ņ", "n"],
["ṋ", "n"],
["ȵ", "n"],
["ṅ", "n"],
["ṇ", "n"],
["ǹ", "n"],
["ɲ", "n"],
["ṉ", "n"],
["ƞ", "n"],
["ᵰ", "n"],
["ᶇ", "n"],
["ɳ", "n"],
["ñ", "n"],
["nj", "nj"],
["ó", "o"],
["ŏ", "o"],
["ǒ", "o"],
["ô", "o"],
["ố", "o"],
["ộ", "o"],
["ồ", "o"],
["ổ", "o"],
["ỗ", "o"],
["ö", "o"],
["ȫ", "o"],
["ȯ", "o"],
["ȱ", "o"],
["ọ", "o"],
["ő", "o"],
["ȍ", "o"],
["ò", "o"],
["ỏ", "o"],
["ơ", "o"],
["ớ", "o"],
["ợ", "o"],
["ờ", "o"],
["ở", "o"],
["ỡ", "o"],
["ȏ", "o"],
["ꝋ", "o"],
["ꝍ", "o"],
["ⱺ", "o"],
["ō", "o"],
["ṓ", "o"],
["ṑ", "o"],
["ǫ", "o"],
["ǭ", "o"],
["ø", "o"],
["ǿ", "o"],
["õ", "o"],
["ṍ", "o"],
["ṏ", "o"],
["ȭ", "o"],
["ƣ", "oi"],
["ꝏ", "oo"],
["ɛ", "e"],
["ᶓ", "e"],
["ɔ", "o"],
["ᶗ", "o"],
["ȣ", "ou"],
["ṕ", "p"],
["ṗ", "p"],
["ꝓ", "p"],
["ƥ", "p"],
["ᵱ", "p"],
["ᶈ", "p"],
["ꝕ", "p"],
["ᵽ", "p"],
["ꝑ", "p"],
["ꝙ", "q"],
["ʠ", "q"],
["ɋ", "q"],
["ꝗ", "q"],
["ŕ", "r"],
["ř", "r"],
["ŗ", "r"],
["ṙ", "r"],
["ṛ", "r"],
["ṝ", "r"],
["ȑ", "r"],
["ɾ", "r"],
["ᵳ", "r"],
["ȓ", "r"],
["ṟ", "r"],
["ɼ", "r"],
["ᵲ", "r"],
["ᶉ", "r"],
["ɍ", "r"],
["ɽ", "r"],
["ↄ", "c"],
["ꜿ", "c"],
["ɘ", "e"],
["ɿ", "r"],
["ś", "s"],
["ṥ", "s"],
["š", "s"],
["ṧ", "s"],
["ş", "s"],
["ŝ", "s"],
["ș", "s"],
["ṡ", "s"],
["ṣ", "s"],
["ṩ", "s"],
["ʂ", "s"],
["ᵴ", "s"],
["ᶊ", "s"],
["ȿ", "s"],
["ɡ", "g"],
["ᴑ", "o"],
["ᴓ", "o"],
["ᴝ", "u"],
["ť", "t"],
["ţ", "t"],
["ṱ", "t"],
["ț", "t"],
["ȶ", "t"],
["ẗ", "t"],
["ⱦ", "t"],
["ṫ", "t"],
["ṭ", "t"],
["ƭ", "t"],
["ṯ", "t"],
["ᵵ", "t"],
["ƫ", "t"],
["ʈ", "t"],
["ŧ", "t"],
["ᵺ", "th"],
["ɐ", "a"],
["ᴂ", "ae"],
["ǝ", "e"],
["ᵷ", "g"],
["ɥ", "h"],
["ʮ", "h"],
["ʯ", "h"],
["ᴉ", "i"],
["ʞ", "k"],
["ꞁ", "l"],
["ɯ", "m"],
["ɰ", "m"],
["ᴔ", "oe"],
["ɹ", "r"],
["ɻ", "r"],
["ɺ", "r"],
["ⱹ", "r"],
["ʇ", "t"],
["ʌ", "v"],
["ʍ", "w"],
["ʎ", "y"],
["ꜩ", "tz"],
["ú", "u"],
["ŭ", "u"],
["ǔ", "u"],
["û", "u"],
["ṷ", "u"],
["ü", "u"],
["ǘ", "u"],
["ǚ", "u"],
["ǜ", "u"],
["ǖ", "u"],
["ṳ", "u"],
["ụ", "u"],
["ű", "u"],
["ȕ", "u"],
["ù", "u"],
["ủ", "u"],
["ư", "u"],
["ứ", "u"],
["ự", "u"],
["ừ", "u"],
["ử", "u"],
["ữ", "u"],
["ȗ", "u"],
["ū", "u"],
["ṻ", "u"],
["ų", "u"],
["ᶙ", "u"],
["ů", "u"],
["ũ", "u"],
["ṹ", "u"],
["ṵ", "u"],
["ᵫ", "ue"],
["ꝸ", "um"],
["ⱴ", "v"],
["ꝟ", "v"],
["ṿ", "v"],
["ʋ", "v"],
["ᶌ", "v"],
["ⱱ", "v"],
["ṽ", "v"],
["ꝡ", "vy"],
["ẃ", "w"],
["ŵ", "w"],
["ẅ", "w"],
["ẇ", "w"],
["ẉ", "w"],
["ẁ", "w"],
["ⱳ", "w"],
["ẘ", "w"],
["ẍ", "x"],
["ẋ", "x"],
["ᶍ", "x"],
["ý", "y"],
["ŷ", "y"],
["ÿ", "y"],
["ẏ", "y"],
["ỵ", "y"],
["ỳ", "y"],
["ƴ", "y"],
["ỷ", "y"],
["ỿ", "y"],
["ȳ", "y"],
["ẙ", "y"],
["ɏ", "y"],
["ỹ", "y"],
["ź", "z"],
["ž", "z"],
["ẑ", "z"],
["ʑ", "z"],
["ⱬ", "z"],
["ż", "z"],
["ẓ", "z"],
["ȥ", "z"],
["ẕ", "z"],
["ᵶ", "z"],
["ᶎ", "z"],
["ʐ", "z"],
["ƶ", "z"],
["ɀ", "z"],
["ff", "ff"],
["ffi", "ffi"],
["ffl", "ffl"],
["fi", "fi"],
["fl", "fl"],
["ij", "ij"],
["œ", "oe"],
["st", "st"],
["ₐ", "a"],
["ₑ", "e"],
["ᵢ", "i"],
["ⱼ", "j"],
["ₒ", "o"],
["ᵣ", "r"],
["ᵤ", "u"],
["ᵥ", "v"],
["ₓ", "x"],
]);