Удалить акценты / диакритические знаки в строке в JavaScript - PullRequest
340 голосов
/ 13 июня 2009

Как удалить акцентированные символы из строки? Особенно в IE6 у меня было что-то вроде этого:

accentsTidy = function(s){
    var r=s.toLowerCase();
    r = r.replace(new RegExp(/\s/g),"");
    r = r.replace(new RegExp(/[àáâãäå]/g),"a");
    r = r.replace(new RegExp(/æ/g),"ae");
    r = r.replace(new RegExp(/ç/g),"c");
    r = r.replace(new RegExp(/[èéêë]/g),"e");
    r = r.replace(new RegExp(/[ìíîï]/g),"i");
    r = r.replace(new RegExp(/ñ/g),"n");                
    r = r.replace(new RegExp(/[òóôõö]/g),"o");
    r = r.replace(new RegExp(/œ/g),"oe");
    r = r.replace(new RegExp(/[ùúûü]/g),"u");
    r = r.replace(new RegExp(/[ýÿ]/g),"y");
    r = r.replace(new RegExp(/\W/g),"");
    return r;
};

но IE6 доставляет мне неприятности, кажется, мне не нравится мое регулярное выражение.

Ответы [ 29 ]

1 голос
/ 28 января 2010

Предполагая, что вы знаете, что делаете, я подозреваю, что IE6 неправильно интерпретирует кодировку файла и, следовательно, не распознает символы не-ASCII в файле:

  • Убедитесь, что файл сохранен как UTF-8 (скажем)
  • Используйте Fiddler или другой инструмент для проверки того, что веб-сервер отправляет правильный HTTP-заголовок Content-Encoding.

(хотя это "пахнет" неправильно, я бы посмотрел на сортировку, скажем, на сервере, используя что-то, учитывающее локали ... но в любом случае ...)

0 голосов
/ 03 августа 2018

Пакет remove-accents NPM - довольно простой способ решения таких проблем:

var input = 'ÀÁÂÃÄÅ';
var output = removeAccents(input);

console.log(output); // AAAAAA
0 голосов
/ 01 марта 2011

Я нашел все это немного неуклюжим, и я не слишком разбираюсь в регулярных выражениях, поэтому вот более простая версия. Было бы довольно легко перевести его на ваш любимый серверный язык, если предположить, что строка уже в Unicode:

// String containing replacement characters for stripping accents 
var stripstring = 
    'AAAAAAACEEEEIIII'+
    'DNOOOOO.OUUUUY..'+
    'aaaaaaaceeeeiiii'+
    'dnooooo.ouuuuy.y'+
    'AaAaAaCcCcCcCcDd'+
    'DdEeEeEeEeEeGgGg'+
    'GgGgHhHhIiIiIiIi'+
    'IiIiJjKkkLlLlLlL'+
    'lJlNnNnNnnNnOoOo'+
    'OoOoRrRrRrSsSsSs'+
    'SsTtTtTtUuUuUuUu'+
    'UuUuWwYyYZzZzZz.';

function stripaccents(str){
    var answer='';
    for(var i=0;i<str.length;i++){
        var ch=str[i];
        var chindex=ch.charCodeAt(0)-192;   // Index of character code in the strip string
        if(chindex>=0 && chindex<stripstring.length){
            // Character is within our table, so we can strip the accent...
            var outch=stripstring.charAt(chindex);
            // ...unless it was shown as a '.'
            if(outch!='.')ch=outch;
        }
        answer+=ch;
    }
    return answer;
}
0 голосов
/ 06 января 2010

function removeAccents(strAccents){
    strAccents = strAccents.split('');
    strAccentsOut = new Array();
    strAccentsLen = strAccents.length;
    var accents = 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž';
    var accentsOut = ['A','A','A','A','A','A','a','a','a','a','a','a','O','O','O','O','O','O','O','o','o','o','o','o','o','E','E','E','E','e','e','e','e','e','C','c','D','I','I','I','I','i','i','i','i','U','U','U','U','u','u','u','u','N','n','S','s','Y','y','y','Z','z'];
    for (var y = 0; y < strAccentsLen; y++) {
        if (accents.indexOf(strAccents[y]) != -1) {
            strAccentsOut[y] = accentsOut[accents.indexOf(strAccents[y])];
        }
        else
            strAccentsOut[y] = strAccents[y];
    }
    strAccentsOut = strAccentsOut.join('');
    return strAccentsOut;
}
0 голосов
/ 23 февраля 2011

Я знаю, что это «обманывает» это на стороне сервера, но на прошлой неделе у меня была похожая задача в Javascript, и я представил простой Java-сервлет и убрал акценты в Java . Это было действительно быстро:)

0 голосов
/ 18 февраля 2016
$scope.legal_name = $sanitize($scope.legal_name);
    console.log("Name before function...",$scope.legal_name);

    var str = "";
    for(var i=0; i < $scope.legal_name.length; i++) {
        var charName = $scope.legal_name.charAt(i);
        if((charName == '&') && ($scope.legal_name.charAt(i + 1) == '#')){
            var count = 0;
            var subString = "";
            while(true) {
                if(($scope.legal_name.charCodeAt(i + 2 + count) > 47) && ($scope.legal_name.charCodeAt(i + 1 + count) < 58 )) {
                    subString = subString + $scope.legal_name.charAt(i + 2 + count);
                    count++;
                } else {
                    if(subString.length > 0) {
                        var value = parseInt(subString);
                        str = str + String.fromCharCode(value);
                        i = i + 1 + count; 
                        break;
                    }
                }
            }               
        } else {
            str = str + charName;
        }
    }
    $scope.legal_name = str;
    console.log("Name After function...",str);
0 голосов
/ 16 декабря 2013

Все вышеперечисленное не работает с разложенным символом, используемым в Mac OS. Чтобы удалить диакритические знаки в этом случае, это более просто:

r = r.replace(new RegExp(/[\u0300-\u036f]/g),"")

см. Комментарий Оливье Мякинена: https://groups.google.com/d/msg/fr.comp.lang.regexp/6IGJTbedGTM/G0sB2kAsR34J (размещено на французском)

0 голосов
/ 03 июля 2015

Если вы открыты для использования библиотеки, вы можете использовать String.js latinize: http://stringjs.com/#methods/latinise

0 голосов
/ 13 июня 2009

Вы можете создавать регулярные выражения несколькими способами. Используя новый RegExp -конструктор:

var re = new RegExp("[a-z]", "ig") //(string pattern, string modifiers)

Или, используя буквенное обозначение регулярного выражения:

var re = /[a-z]/ig; // /pattern/modifiers

Вы смешали два.

...