Efficiently replace all accented characters in a string?

后端 未结 21 2566
别跟我提以往
别跟我提以往 2020-11-22 04:35

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

21条回答
  •  盖世英雄少女心
    2020-11-22 05:30

    A direct port to javascript of Kierons solution: https://github.com/rwarasaurus/nano/blob/master/system/helpers.php#L61-73:

    /**
     * Normalise a string replacing foreign characters
     *
     * @param {String} str
     * @return {String} str
     */
    
    var normalize = (function () {
        var a = ['À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď', 'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ', 'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ', 'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ', 'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ', 'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż', 'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ', 'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ'];
        var b = ['A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o'];
    
        return function (str) {
            var i = a.length;
            while (i--) str = str.replace(a[i], b[i]);
            return str;
        };
    }());
    

    And a slightly modified version, using a char-map instead of two arrays:

    To compare these two methods I made a simple benchmark: http://jsperf.com/replace-foreign-characters

    /**
     * Normalise a string replacing foreign characters
     *
     * @param {String} str
     * @return {String}
     */
    var normalize = (function () {
        var map = {
                "À": "A",
                "Á": "A",
                "Â": "A",
                "Ã": "A",
                "Ä": "A",
                "Å": "A",
                "Æ": "AE",
                "Ç": "C",
                "È": "E",
                "É": "E",
                "Ê": "E",
                "Ë": "E",
                "Ì": "I",
                "Í": "I",
                "Î": "I",
                "Ï": "I",
                "Ð": "D",
                "Ñ": "N",
                "Ò": "O",
                "Ó": "O",
                "Ô": "O",
                "Õ": "O",
                "Ö": "O",
                "Ø": "O",
                "Ù": "U",
                "Ú": "U",
                "Û": "U",
                "Ü": "U",
                "Ý": "Y",
                "ß": "s",
                "à": "a",
                "á": "a",
                "â": "a",
                "ã": "a",
                "ä": "a",
                "å": "a",
                "æ": "ae",
                "ç": "c",
                "è": "e",
                "é": "e",
                "ê": "e",
                "ë": "e",
                "ì": "i",
                "í": "i",
                "î": "i",
                "ï": "i",
                "ñ": "n",
                "ò": "o",
                "ó": "o",
                "ô": "o",
                "õ": "o",
                "ö": "o",
                "ø": "o",
                "ù": "u",
                "ú": "u",
                "û": "u",
                "ü": "u",
                "ý": "y",
                "ÿ": "y",
                "Ā": "A",
                "ā": "a",
                "Ă": "A",
                "ă": "a",
                "Ą": "A",
                "ą": "a",
                "Ć": "C",
                "ć": "c",
                "Ĉ": "C",
                "ĉ": "c",
                "Ċ": "C",
                "ċ": "c",
                "Č": "C",
                "č": "c",
                "Ď": "D",
                "ď": "d",
                "Đ": "D",
                "đ": "d",
                "Ē": "E",
                "ē": "e",
                "Ĕ": "E",
                "ĕ": "e",
                "Ė": "E",
                "ė": "e",
                "Ę": "E",
                "ę": "e",
                "Ě": "E",
                "ě": "e",
                "Ĝ": "G",
                "ĝ": "g",
                "Ğ": "G",
                "ğ": "g",
                "Ġ": "G",
                "ġ": "g",
                "Ģ": "G",
                "ģ": "g",
                "Ĥ": "H",
                "ĥ": "h",
                "Ħ": "H",
                "ħ": "h",
                "Ĩ": "I",
                "ĩ": "i",
                "Ī": "I",
                "ī": "i",
                "Ĭ": "I",
                "ĭ": "i",
                "Į": "I",
                "į": "i",
                "İ": "I",
                "ı": "i",
                "IJ": "IJ",
                "ij": "ij",
                "Ĵ": "J",
                "ĵ": "j",
                "Ķ": "K",
                "ķ": "k",
                "Ĺ": "L",
                "ĺ": "l",
                "Ļ": "L",
                "ļ": "l",
                "Ľ": "L",
                "ľ": "l",
                "Ŀ": "L",
                "ŀ": "l",
                "Ł": "l",
                "ł": "l",
                "Ń": "N",
                "ń": "n",
                "Ņ": "N",
                "ņ": "n",
                "Ň": "N",
                "ň": "n",
                "ʼn": "n",
                "Ō": "O",
                "ō": "o",
                "Ŏ": "O",
                "ŏ": "o",
                "Ő": "O",
                "ő": "o",
                "Œ": "OE",
                "œ": "oe",
                "Ŕ": "R",
                "ŕ": "r",
                "Ŗ": "R",
                "ŗ": "r",
                "Ř": "R",
                "ř": "r",
                "Ś": "S",
                "ś": "s",
                "Ŝ": "S",
                "ŝ": "s",
                "Ş": "S",
                "ş": "s",
                "Š": "S",
                "š": "s",
                "Ţ": "T",
                "ţ": "t",
                "Ť": "T",
                "ť": "t",
                "Ŧ": "T",
                "ŧ": "t",
                "Ũ": "U",
                "ũ": "u",
                "Ū": "U",
                "ū": "u",
                "Ŭ": "U",
                "ŭ": "u",
                "Ů": "U",
                "ů": "u",
                "Ű": "U",
                "ű": "u",
                "Ų": "U",
                "ų": "u",
                "Ŵ": "W",
                "ŵ": "w",
                "Ŷ": "Y",
                "ŷ": "y",
                "Ÿ": "Y",
                "Ź": "Z",
                "ź": "z",
                "Ż": "Z",
                "ż": "z",
                "Ž": "Z",
                "ž": "z",
                "ſ": "s",
                "ƒ": "f",
                "Ơ": "O",
                "ơ": "o",
                "Ư": "U",
                "ư": "u",
                "Ǎ": "A",
                "ǎ": "a",
                "Ǐ": "I",
                "ǐ": "i",
                "Ǒ": "O",
                "ǒ": "o",
                "Ǔ": "U",
                "ǔ": "u",
                "Ǖ": "U",
                "ǖ": "u",
                "Ǘ": "U",
                "ǘ": "u",
                "Ǚ": "U",
                "ǚ": "u",
                "Ǜ": "U",
                "ǜ": "u",
                "Ǻ": "A",
                "ǻ": "a",
                "Ǽ": "AE",
                "ǽ": "ae",
                "Ǿ": "O",
                "ǿ": "o"
            },
            nonWord = /\W/g,
            mapping = function (c) {
                return map[c] || c; 
            };
    
    
        return function (str) {
            return str.replace(nonWord, mapping);
        };
    }());
    

提交回复
热议问题