Comment changer les caractères diacritiques non-diacritique [dupliquer]
cette question a déjà une réponse ici:
j'ai trouvé une réponse comment supprimer les caractères diacritiques sur stackoverflow, mais pourriez-vous me dire s'il est possible de changer les caractères diacritiques non diacritiques?
Oh.. et je pense à ce sujet .NET (ou autre si pas possible)
5 réponses
Copie de ma propre réponse à une autre question :
au lieu de créer votre propre table, vous pouvez convertir le texte à la forme de normalisation D, où les caractères sont représentés comme un caractère de base plus les diacritiques (par exemple," á "sera remplacé par" a " suivi d'une combinaison accent aigu). Vous pouvez alors dépouiller tout ce qui n'est pas une lettre ASCII.
les tableaux encore existent, mais sont maintenant ceux de la norme Unicode.
vous pouvez également essayer NFKD au lieu de NFD, pour attraper encore plus de cas.
, les Références:
puisque personne n'a jamais pris la peine de poster le code pour le faire, le voici:
// \p{Mn} or \p{Non_Spacing_Mark}:
// a character intended to be combined with another
// character without taking up extra space
// (e.g. accents, umlauts, etc.).
private readonly static Regex nonSpacingMarkRegex =
new Regex(@"\p{Mn}", RegexOptions.Compiled);
public static string RemoveDiacritics(string text)
{
if (text == null)
return string.Empty;
var normalizedText =
text.Normalize(NormalizationForm.FormD);
return nonSpacingMarkRegex.Replace(normalizedText, string.Empty);
}
Note: une grande raison pour avoir besoin de faire cela est quand vous intégrez à un système tiers qui ne fait que de l'ascii, mais vos données sont en unicode. Ce qui est commun. Vos options sont essentiellement: supprimer les caractères accentués, ou tenter de supprimer les accents des caractères accentués pour tenter de préserver autant que vous le pouvez de l'entrée originale. Évidemment, ce n'est pas un solution parfaite mais c'est 80% mieux que de simplement supprimer n'importe quel caractère au-dessus de ascii 127.
Il pourrait aussi être intéressant de prendre du recul et considérer pourquoi vous voulez le faire. Si vous essayez d'éliminer les différences de caractères que vous considérez insignifiantes, vous devriez regarder L'algorithme de collation Unicode. C'est la façon standard de ne pas tenir compte des différences telles que case ou diacritics lors de la comparaison de chaînes pour la recherche ou le tri.
si vous prévoyez d'afficher le texte modifié, tenez compte de votre auditoire. Ce que vous pouvez filtrer en toute sécurité de là est locale sensibles. En anglais américain, "Igloo" = "igloo", et "resume" = "résumé", mais en turc, un minuscule I est I (dotless), et en français, cote signifie citation, côté signifie côté, et côte signifie côte. Ainsi, le langage de collation détermine quelles différences sont significatives.
si supprimer diacritics est la bonne solution pour votre application, il est plus sûr de produire votre propre table à laquelle vous ajoutez explicitement les caractères que vous voulez convertir.
une approche générale et automatisée pourrait être conçue en utilisant la décomposition Unicode. Avec cela, vous pouvez décomposer un caractère avec des diacritiques en "combinant" des caractères (les marques diacritiques) et le caractère de base avec lequel ils sont combinés. Filtrer toute chose qui est un caractère de combinaison, et vous devriez avoir les "non-diacritiques" ceux.
L'absence de discrimination dans la méthode automatisée, cependant, pourrait avoir des effets inattendus. Je le recommande a beaucoup de test sur un corps de texte représentatif.
pour un exemple simple:
pour supprimer les diacritiques d'une chaîne de caractères:
string newString = myDiacriticsString.Normalize(NormalizationForm.FormD);
mon site introduit des données de sources externes qui ont beaucoup de caractères étranges. J'ai écrit la fonction C# suivante pour remplacer les caractères accentués et rayer les caractères de clavier non-US en utilisant Regex:
using System.Text;
using System.Text.RegularExpressions;
internal static string SanitizeString(string source)
{
return Regex.Replace(source.Normalize(NormalizationForm.FormD), @"[^A-Za-z 0-9 \.,\?'""!@#$%\^&\*\(\)-_=\+;:<>\/\\|\}\{\[\]`~]*", string.Empty).Trim();
}
J'espère que ça aidera.