Remplacer les caractères en C# (ascii)

j'ai un fichier avec des caractères comme ceux - ci: à, è, ì, Ò, ù-À. Ce que je dois faire, c'est remplacer ces caractères par des caractères normaux, par exemple: à = A, è = e et ainsi de suite..... C'est mon code jusqu'à présent:

StreamWriter sw = new StreamWriter(@"C:/JoinerOutput.csv");
string path = @"C:/Joiner.csv";
string line = File.ReadAllText(path);

if (line.Contains("à"))
{
    string asAscii = Encoding.ASCII.GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(Encoding.ASCII.EncodingName, new EncoderReplacementFallback("a"), new DecoderExceptionFallback()), Encoding.UTF8.GetBytes(line)));
    Console.WriteLine(asAscii);
    Console.ReadLine();

    sw.WriteLine(asAscii);
    sw.Flush();
}

recherche un caractère spécifique dans le fichier et le remplace par un autre. Le problème que j'ai, c'est que ma déclaration sur la fi ne fonctionne pas. Comment puis-je résoudre ce problème?

ceci est un échantillon du fichier d'entrée:

Dimàkàtso Mokgàlo
Màmà Ràtlàdi
Koos Nèl
Pàsèkà Modisè
Jèrèmiàh Morèmi
Khèthiwè Buthèlèzi
Tiànà Pillày
Viviàn Màswàngànyè
Thirèshàn Rèddy
Wàdè Cornèlius
ènos Nètshimbupfè

C'est la sortie si utilisation : ligne = ligne.Remplacer ('à',' a');:

Ch�rl�n� Kirst�n
M�m� R�tl�di
Koos N�l
P�s�k� Modis�
J�r�mi�h Mor�mi
Kh�thiw� Buth�l�zi
Ti�n� Pill�y
Vivi�n M�sw�ng�ny�
Thir�sh�n R�ddy
W�d� Corn�lius
�nos N�tshimbupf�

avec mon code le symbole sera supprimé complètement

9
demandé sur Gabe 2011-03-28 17:25:59

7 réponses

Je ne sais pas si c'est utile, mais dans un outil interne pour écrire un message sur un écran led nous avons les remplacements suivants (je suis sûr qu'il y a des moyens plus intelligents pour faire ce travail pour les tables unicode, mais celui-ci est suffisant pour ce petit outil interne):

        strMessage = Regex.Replace(strMessage, "[éèëêð]", "e");
        strMessage = Regex.Replace(strMessage, "[ÉÈËÊ]", "E");
        strMessage = Regex.Replace(strMessage, "[àâä]", "a");
        strMessage = Regex.Replace(strMessage, "[ÀÁÂÃÄÅ]", "A");
        strMessage = Regex.Replace(strMessage, "[àáâãäå]", "a");
        strMessage = Regex.Replace(strMessage, "[ÙÚÛÜ]", "U");
        strMessage = Regex.Replace(strMessage, "[ùúûüµ]", "u");
        strMessage = Regex.Replace(strMessage, "[òóôõöø]", "o");
        strMessage = Regex.Replace(strMessage, "[ÒÓÔÕÖØ]", "O");
        strMessage = Regex.Replace(strMessage, "[ìíîï]", "i");
        strMessage = Regex.Replace(strMessage, "[ÌÍÎÏ]", "I");
        strMessage = Regex.Replace(strMessage, "[š]", "s");
        strMessage = Regex.Replace(strMessage, "[Š]", "S");
        strMessage = Regex.Replace(strMessage, "[ñ]", "n");
        strMessage = Regex.Replace(strMessage, "[Ñ]", "N");
        strMessage = Regex.Replace(strMessage, "[ç]", "c");
        strMessage = Regex.Replace(strMessage, "[Ç]", "C");
        strMessage = Regex.Replace(strMessage, "[ÿ]", "y");
        strMessage = Regex.Replace(strMessage, "[Ÿ]", "Y");
        strMessage = Regex.Replace(strMessage, "[ž]", "z");
        strMessage = Regex.Replace(strMessage, "[Ž]", "Z");
        strMessage = Regex.Replace(strMessage, "[Ð]", "D");
        strMessage = Regex.Replace(strMessage, "[œ]", "oe");
        strMessage = Regex.Replace(strMessage, "[Œ]", "Oe");
        strMessage = Regex.Replace(strMessage, "[«»\u201C\u201D\u201E\u201F\u2033\u2036]", "\"");
        strMessage = Regex.Replace(strMessage, "[\u2026]", "...");

une chose à noter est que si dans la plupart des langues le texte est encore compréhensible après un tel traitement, ce n'est pas toujours le cas et va souvent forcer le lecteur à se référer à la contexte de la phrase pour pouvoir la comprendre. Pas quelque chose que tu veux si tu as le choix.


notez que la solution correcte serait d'utiliser les tables unicode, en remplaçant les caractères par des diacritiques intégrées avec leur(S)" marque (s) diacritique (s) combinée (s) " +forme des caractères et en supprimant ensuite les diacritiques...

9
répondu Julien Roncaglia 2011-03-28 15:07:21

D'autres ont commenté l'utilisation d'une table de recherche Unicode pour supprimer les diacritiques. J'ai fait une recherche rapide sur Google et j'ai trouvé cet exemple . Code sans vergogne copié, (reformaté), et posté ci-dessous:

using System;
using System.Text;
using System.Globalization;

public static class Remove
{
    public static string RemoveDiacritics(string stIn)
    {
        string stFormD = stIn.Normalize(NormalizationForm.FormD);
        StringBuilder sb = new StringBuilder();

        for(int ich = 0; ich < stFormD.Length; ich++) {
            UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
            if(uc != UnicodeCategory.NonSpacingMark) {
                sb.Append(stFormD[ich]);
            }
        }

        return(sb.ToString().Normalize(NormalizationForm.FormC));
    }
}

ainsi, votre code pourrait nettoyer l'entrée en appelant:

line = Remove.RemoveDiacritics(line);
16
répondu dana 2014-10-08 17:05:34

j'utilise souvent une méthode d'extension basée sur la version Dana fournie. Une explication rapide:

  • la Normalisation de la forme D divise charactes comme è à une e et un nonspacing `
  • A partir de cela, les caractères de nospacing sont supprimés
  • le résultat est normalisé retour à la forme D (Je ne suis pas sûr si c'est nécessaire)

Code:

using System.Linq;
using System.Text;
using System.Globalization;

// namespace here
public static class Utility
{
    public static string RemoveDiacritics(this string str)
    {
        if (str == null) return null;
        var chars =
            from c in str.Normalize(NormalizationForm.FormD).ToCharArray()
            let uc = CharUnicodeInfo.GetUnicodeCategory(c)
            where uc != UnicodeCategory.NonSpacingMark
            select c;

        var cleanStr = new string(chars.ToArray()).Normalize(NormalizationForm.FormC);

        return cleanStr;
    }
}
5
répondu realbart 2012-10-31 09:40:12

pourquoi compliquez-vous les choses?

line = line.Replace('à', 'a');

mise à jour:

Les docs pour File.ReadAllText dis:

cette méthode tente d'automatiser détecter l'encodage d'un fichier basé sur la présence de marques d'ordre d'octet. Formats D'encodage UTF-8 et UTF-32 (à la fois big-endian et little-endian) peut être détectée.

utilisez la chaîne ReadAllText(String, Encodage) surcharge de la méthode lors de la lecture de fichiers qui pourrait contenir du texte importé, parce que les caractères non reconnus peuvent de ne pas être lu correctement.

Quel est l'encodage C:/Joiner.csv ? Peut-être devriez-vous utiliser l'autre surcharge pour File.ReadAllText où vous spécifiez vous-même l'encodage de l'entrée?

3
répondu Jon 2011-03-28 13:27:30

utilisez ceci:

     if (line.Contains(“OldChar”))
     {
        line = line.Replace(“OldChar”, “NewChar”);
     }
1
répondu CloudyMarble 2011-03-28 13:30:11
"151910920 de Faire, la manière facile. Le code ci-dessous remplacera tous les caractères spéciaux en caractères ASCII en seulement 2 lignes de code. Il vous donne le même résultat que la solution de Julien Roncaglia.

byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(inputText);
string outputText = System.Text.Encoding.ASCII.GetString(bytes);
1
répondu Ton Snoei 2016-10-11 08:16:17

sonne comme ce que vous voulez faire est de convertir ASCII étendu (huit-bit) en ASCII (sept-bit) - donc la recherche pour cela pourrait aider.

j'ai vu des bibliothèques pour gérer cela dans d'autres langues mais n'ont jamais eu à le faire en C#, cela ressemble à ce pourrait être un peu instructif cependant:

Convertissez deux caractères ascii à leur "correspondant" un caractère représentation ASCII étendue

0
répondu Iain Collins 2017-05-23 12:24:51