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
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...
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);
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;
}
}
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?
utilisez ceci:
if (line.Contains(“OldChar”))
{
line = line.Replace(“OldChar”, “NewChar”);
}
byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(inputText);
string outputText = System.Text.Encoding.ASCII.GetString(bytes);
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