J'essaie de convertir des chaînes qui sont en français canadien et, fondamentalement, j'aimerais pouvoir retirer les marques d'accent français dans les lettres tout en gardant la lettre. (Par exemple, convertir é
en e
, crème brûlée
deviendrait ainsi creme brulee
)
Quelle est la meilleure méthode pour y parvenir?
.net
string
diacritics
James Hall
la source
la source
Réponses:
Je n'ai pas utilisé cette méthode, mais Michael Kaplan décrit une méthode pour le faire dans son article de blog (avec un titre déroutant) qui parle de la suppression des signes diacritiques: la suppression est un travail intéressant sont sans espacement, mais certains sont plus sans espacement que d'autres)
Notez qu'il s'agit d'un suivi de son précédent article: Stripping diacritics ....
L'approche utilise String.Normalize pour diviser la chaîne d'entrée en glyphes constitutifs (séparant fondamentalement les caractères "de base" des signes diacritiques), puis analyse le résultat et conserve uniquement les caractères de base. C'est juste un peu compliqué, mais vous regardez vraiment un problème compliqué.
Bien sûr, si vous vous limitez au français, vous pouvez probablement vous en tirer avec l'approche simple basée sur une table dans Comment supprimer les accents et le tilde dans une chaîne std :: C ++ , comme recommandé par @David Dibben.
la source
cela a fait l'affaire pour moi ...
rapide et court!
la source
«
»
et…
(en tant que caractère unique) seront modifiés dans le processus, ce qui n'est pas le cas avec la solution acceptée.System.ArgumentException: 'ISO-8859-8' is not a supported encoding name.
System.Text.Encoding.CodePages
partir de nuget, puis appelez cela pour enregistrer le fournisseur:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- une fois que vous avez fait cela, vous pouvez utiliser ISO-8859-8Au cas où quelqu'un serait intéressé, je cherchais quelque chose de similaire et j'ai fini d'écrire ce qui suit:
la source
c < 128
, pour nous assurer que nous ne récupérons aucun caractère UTF, voir ici .c < 123
. voir ASCIJ'avais besoin de quelque chose qui convertit tous les principaux caractères Unicode et la réponse votée en a laissé quelques-uns, j'ai donc créé une version de CodeIgniter
convert_accented_characters($str)
en C # qui est facilement personnalisable:Usage
la source
if (entry.Key.IndexOf(c) != -1)
parif (entry.Key.Contains(c))
{ "äæǽ", "ae" }
au lieu de{ "ä", "ae" }, { "æ", "ae" }, { "ǽ", "ae" }
simplement appelerif (foreign_characters.TryGetValue(...)) ...
. Vous avez complètement déjoué le but de l'index que le dictionnaire a déjà.Au cas où quelqu'un serait intéressé, voici l'équivalent java:
la source
J'utilise souvent une méthode d'extension basée sur une autre version que j'ai trouvée ici (voir Remplacement de caractères en C # (ascii) ) Une explication rapide:
Code:
la source
Le CodePage du grec (ISO) peut le faire
Les informations sur cette page de codes sont entrées
System.Text.Encoding.GetEncodings()
. En savoir plus sur: https://msdn.microsoft.com/pt-br/library/system.text.encodinginfo.getencoding(v=vs.110).aspxLe grec (ISO) a la page de code 28597 et le nom iso-8859-7 .
Accédez au code ... \ o /
Alors, écrivez cette fonction ...
Notez que ...
Encoding.GetEncoding("iso-8859-7")
est équivalent àEncoding.GetEncoding(28597)
parce que le premier est le nom et le second la page de code de l'encodage.la source
äáčďěéíľľňôóřŕšťúůýž ÄÁČĎĚÉÍĽĽŇÔÓŘŔŠŤÚŮÝŽ ÖÜË łŁđĐ ţŢşŞçÇ øı
). Les problèmes ont été trouvés uniquement avecßə
, qui sont convertis en?
, mais ces exceptions peuvent toujours être traitées de manière distincte. Avant de mettre cela en production, le test doit être mieux effectué contre toutes les zones Unicode contenant des lettres avec des signes diacritiques.C'est drôle qu'une telle question puisse obtenir autant de réponses, et pourtant aucune ne correspond à mes exigences :) Il y a tellement de langues autour, une solution agnostique en langue complète n'est pas vraiment possible AFAIK, car d'autres ont mentionné que le FormC ou le FormD posent des problèmes.
Étant donné que la question initiale était liée au français, la réponse de travail la plus simple est en effet
1251 doit être remplacé par le code de codage de la langue d'entrée.
Cela ne remplace cependant qu'un seul caractère par un caractère. Comme je travaille également avec l'allemand en entrée, j'ai fait une conversion manuelle
Il peut ne pas offrir les meilleures performances, mais au moins, il est très facile à lire et à étendre. Regex est un NO GO, beaucoup plus lent que tout autre élément char / string.
J'ai également une méthode très simple pour supprimer l'espace:
Finalement, j'utilise une combinaison des 3 extensions ci-dessus:
Et un petit test unitaire à celui (non exhaustif) qui passe avec succès.
la source
Cela fonctionne bien en java.
Il convertit essentiellement tous les caractères accentués en leurs homologues désaccentués, suivis de leurs diacritiques combinants. Vous pouvez maintenant utiliser une expression régulière pour éliminer les signes diacritiques.
la source
"\\p{Block=CombiningDiacriticalMarks}"
TL; DR - Méthode d'extension de chaîne C #
Je pense que la meilleure solution pour conserver le sens de la chaîne est de convertir les caractères au lieu de les supprimer, ce qui est bien illustré dans l'exemple
crème brûlée
parcrme brle
rapportcreme brulee
.J'ai vérifié le commentaire d'Alexandre ci - dessus et j'ai vu que le code Lucene.Net est sous licence Apache 2.0, j'ai donc modifié la classe en une simple méthode d'extension de chaîne. Vous pouvez l'utiliser comme ceci:
La fonction est trop longue pour être publiée dans une réponse StackOverflow (~ 139k caractères de 30k autorisés lol) alors j'ai fait un résumé et attribué les auteurs :
J'espère que cela aide quelqu'un d'autre, c'est la solution la plus robuste que j'ai trouvée!
la source
CECI EST LA VERSION VB (fonctionne avec le GREC):
Imports System.Text
Imports System.Globalization
la source
Essayez le package HelperSharp .
Il existe une méthode RemoveAccents:
la source
Voici comment je remplace les caractères diacritiques par des caractères non diacritiques dans tout mon programme .NET
C #:
VB .NET:
la source
vous pouvez utiliser l'extension de chaîne du package nuget MMLib.Extensions:
Page Nuget: https://www.nuget.org/packages/MMLib.Extensions/ Site du projet Codeplex https://mmlib.codeplex.com/
la source
Popping cette bibliothèque ici si vous ne l'avez pas déjà considérée. Il semble qu'il y ait une gamme complète de tests unitaires avec elle.
https://github.com/thomasgalliker/Diacritics.NET
la source
la source
Ce que cette personne a dit:
Encoding.ASCII.GetString(Encoding.GetEncoding(1251).GetBytes(text));
Il divise en fait ce
å
qui est un caractère (qui est le code de caractère00E5
, pas0061
plus le modificateur030A
qui aurait la même apparence) ena
plus une sorte de modificateur, puis la conversion ASCII supprime le modificateur, laissant le seula
.la source
J'aime vraiment le code concis et fonctionnel fourni par azrafe7 . Donc, je l'ai un peu changé pour le convertir en une méthode d'extension:
la source
N'ayant pas assez de réputation, je ne peux apparemment pas commenter l'excellent lien d'Alexandre. - Lucene semble être la seule solution fonctionnant dans des cas raisonnablement génériques.
Pour ceux qui veulent une solution simple de copier-coller, la voici, en exploitant le code dans Lucene:
banc d'essai de chaîne = "ÁÂÄÅÇÉÍÎÓÖØÚÜÞàáâãäåæçèéêëìíîïðñóôöøúüāăčĐęğıŁłńŌōřŞşšźžșțệủ";
Console.WriteLine (Lucene.latinizeLucene (banc d'essai));
//////////
la source