Supprimer les accents/caractères diacritiques dans une chaîne de caractères en JavaScript

Comment puis-je supprimer des caractères accentués à partir d'une chaîne?
Surtout dans IE6, j'ai eu quelque chose comme ceci:

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;
};

mais IE6 qui me dérange, il semble qu'il n'aime pas mon expression régulière.

  • pourquoi sur terre serait vous voulez supprimer les accents? Cela ressemble à une sorte de forcé l'Anglicisation de noms.... et un pauvre à qui. '山田太郎" serait juste de devenir une chaîne vide.
  • Je veux trier par ordre alphabétique dans un véritable ordre alphabétique, sans avoir les lettres accentuées systématiquement à la fin. Je Peux ? (Et je suis français, donc anglicisation... 🙂 )
  • Les réponses ici semblent ignorer la question de la normalisation. Une solution robuste qui vous auriez à chercher à faire le genre de choses qui sont effectuées par des github.com/walling/unorm .
  • Certains logiciels ne permettent pas de caractères spéciaux dans un id d'emplacement. (PAGE HTML NOMS par exemple) C'est une autre raison de vouloir les supprimer. Garder le titre dans sa forme originale, mais ne pas avoir à retaper tous ces personnages.
  • votre exemple serait formidable pour la validation, mais pas de désinfection. Si la chaîne de caractères qu'un utilisateur saisit a des limites, ils ont besoin de savoir cela et être invité à entrer la chaîne de caractères avec les contraintes prévues. L'OP est en fait juste pour le tri et pas pour des changements permanents pour les données. OP serait probablement bénéficier de tri à l'aide de la localeCompare() méthode qui va vous permettre de trier les chaînes en fonction des paramètres régionaux du navigateur (pour la même raison à l'utilisation toLocaleString() lorsque l'on travaille avec les dates)
  • avez-vous essayé d'utiliser localeCompare ? "ca".localeCompare("ça") me donne -132 dans google Chrome. Le navigateur de paramètres régionaux ne vous dira jamais que "c" est égal à "ç". Et c'est très bien, car il ne devrait pas. Ils sont en effet différents.
  • J'ai fouillé un peu plus sur la question. La spécification de ne pas appliquer quelque chose au sujet de la locale (je ne peux pas savoir ce que le navigateur va le faire), mais recommande que les navigateurs transcrire la chaîne de caractères en Unicode Forme Normalisée (unicode.org/reports/tr15/#Norm_Forms). Dans cette forme de "ç" est traduit dans le caractère 'c' plus le caractère 'cédille'. Ce n'est pas ce que je veux.
  • Je ne suis pas sûr que cela travail dans ma situation, étant donné que l'utilisateur est entré dans le titre requis est le titre de l'article. Il serait déraisonnable pour moi de leur demander de modifier leur titre (sauf peut-être si ils ont écrit des articles au sujet de l'encodage) Mais leur "C est la vie." - c'est leur titre, j'ai besoin que les données, juste mes modifications de la structure à à "cest_la_vie".. ne sais Pas si je suis clair mais c'est mon affaire, probablement rien à voir avec l'OP
  • Possible dup stackoverflow.com/questions/863800/...
  • Ceci est très utile pour les recherches de trop. Je suis en train de construire une recherche d'entrée de boîte où vous tapez joueur de football les noms de tous les coins du monde et je veux d'auto-complétion. Devinez ce que dans ma langue, il n'y a pas de signes diacritiques il est donc difficile pour moi de taper des noms comme "López" ou "Óscar'
  • IE6 problème peut être dû au fait que RE d'origine constructeur arguments sont censés être des chaînes de caractères ("PATTERN" [, flags]) new RegExp("ab+c", "g"); et déjà créé objet regexp source
  • Cela est inexact, puisque vous êtes seulement sur certains des caractères accentués. Par exemple, si seulement compter avec des signes diacritiques, nous avons une longue liste de "áàăắằẵẳaáàâǎâấầẫẩaǎaaaåǻåäääääǟãããaȧȧǡąąąąąąąąąąāąąąąąąāāāāāā aáàâäāåảȁȃạạạặậạạạḁⱥaᶏɑɑɑaᶐ" et il n'est pas encore la liste complète. En outre, le dictionnaire n'est pas la même dans toutes les langues. Par exemple tchèque envisager CH un caractère distinct et de le mettre juste après H. Certaines langues comme le norvégien mettre les caractères accentués "æøå" à la fin de l'alphabet au lieu
  • Dans les vieux jours CH est également une lettre en espagnol alphabet placé après le C, CH sera après CZ. Donc enlever tous les signes diacritiques et de tri n'est pas une bonne façon d'aller.
  • Voici un cas d'utilisation: Dans geocaching.com/geocache/... il est le code utilisé dans l'énigme avec une opération demandant de remplacer les lettres par des nombres A=1, B=2, C=3, ... puis ajouter chacun de ces numéros. Dans ce code, É sera de 5 aussi, comme l'E.
  • La meilleure façon serait pour tout le monde pour réaliser que a et a with something est encore un a ... et supprimer l'ensemble "diacritique lettres de lettres!" chose du monde... malheureusement, je doute que cela va être fait, mais l'espoir meurt en dernier...
  • Double Possible de Efficacement remplacer tous les caractères accentués dans une chaîne de caractères?
  • Pensez à mettre à jour votre réponse pour ma réponse qui est plus up-to-date/actuel, à l'aide de ES6.
  • L'on a accepté la réponse est obsolète et il y a une BIEN meilleure solution énumérés ci-dessous. Les gens peuvent venir sur cette page et en fait utiliser cette solution. Veuillez mettre à jour votre réponse.
  • Ceci est un XY problème! Si vous êtes en essayant de trier des chaînes de caractères comme e < é < f, puis vous effectuez Unicode classement — de sorte que vous devriez utiliser l' (personnalisable, dépendant de paramètres régionaux) Unicode collation algorithm, mis en œuvre par le Intl.Collator en JavaScript.
  • Sûr, mais quand la question a été posée, je ne sais pas ce que je doit attendre 3 ans pour l'Intl.Collateur de spec à être défini.
  • Compte tenu de l'état JS était en 2009, vous n'êtes pas du tout dans le mauvais. Mais je pense que de très nombreux Googlers va se retrouver avec le même objectif que le vôtre (quelle autre raison est là pour éliminer les signes diacritiques?) et il vaut la peine de mentionner que Intl.Collator existe maintenant de résoudre le X problème, tout comme @LewisDiamond mentionné que normalize('NFD') existe maintenant de résoudre le Y problème.
  • convenu Intl.Collateur est probablement ce que l'OP a été à la recherche pour. J'ai ajouté l'info à ma réponse à assurez-vous que les gens ont deux options en fonction de ce dont ils ont besoin.
  • pourquoi faites-vous new RegExp(/foo/g) au lieu de simplement /foo/g (ce qui crée une instance de RegExp?

InformationsquelleAutor glmxndr | 2009-06-13