2017-04-05 1 views
0

Je voudrais utiliser la méthode Replace() mais en utilisant des valeurs hexadécimales au lieu de la valeur de chaîne.Replace() fonctionne avec la valeur hexadécimale

J'ai un programme en C# qui écrit un fichier texte.

Je ne sais pas pourquoi, mais quand le programme écrit le '°' (-> Number) il est écrit ° (en hexadécimal: C2 B0 au lieu de B0).

Je voudrais juste patcher, afin de corect cela.

Est-il possible de faire re lieu afin de remplacer C2B0 par B0? Comment ça?

Merci beaucoup :)

+0

Pourquoi 'Replace()' ne fonctionne-t-il pas? 'yourString.Replace ((char) 0xC2B0, (char) 0xB0);' – Equalsk

+0

Il n'est pas clair ce que vous entendez par "en hexadécimal" ici. Si vous voulez dire que ce sont les données dans le fichier texte en le considérant comme * binaire *, vous devriez probablement traiter les données comme binaires pour commencer. Je suppose que vous ne voulez pas dire [U + C2B0] (http://www.fileformat.info/info/unicode/char/c2b0/index.htm). –

+0

ce n'est pas un candidat pour les remplacements, mais un problème de codage (Unicode <> ANSI). quelle application rend cela comme "Â °"? pourriez-vous montrer un exemple minimal du code qui écrit dans le fichier? – dlatikay

Répondre

0

Je ne sais pas si cela est la meilleure solution pour votre problème, mais si vous voulez une fonction de remplacement pour une chaîne en utilisant des valeurs hexadécimaux cela fonctionnera:

var newString = HexReplace(sourceString, "C2B0", "B0"); 


    private static string HexReplace(string source, string search, string replaceWith) { 
     var realSearch = string.Empty; 
     var realReplace = string.Empty; 

     if(search.Length % 2 == 1) throw new Exception("Search parameter incorrect!"); 

     for (var i = 0; i < search.Length/2; i++) { 
      var hex = search.Substring(i * 2, 2); 
      realSearch += (char)int.Parse(hex, System.Globalization.NumberStyles.HexNumber); 
     } 
     for (var i = 0; i < replaceWith.Length/2; i++) { 
      var hex = replaceWith.Substring(i * 2, 2); 
      realReplace += (char)int.Parse(hex, System.Globalization.NumberStyles.HexNumber); 
     } 

     return source.Replace(realSearch, realReplace); 
    } 
0

cordes C# sont Unicode. Lorsqu'ils sont écrits dans un fichier, un codage doit être appliqué. L'encodage par défaut utilisé par File.WriteAllText est utf-8 with no byte order mark.

La séquence codée sur deux octets 0xC2B0 est la représentation du signe ° degré U + 00B0 codepoint in utf-8.

Pour se débarrasser de la partie 0xC2, appliquer un codage différent, par exemple latin-1:

var latin1 = Encoding.GetEncoding(1252); 
File.WriteAllText(path, text, latin1); 

Pour faire face à l'idée « hex remplacer » de la question: Les meilleures pratiques pour éliminer la utf-8 L'octet principal des fichiers existants serait de faire un ReadAllText avec utf-8, suivi d'un WriteAllText comme indiqué ci-dessus (ou du découpage de flux si les fichiers sont trop gros pour être lus en mémoire dans leur ensemble).

SBCS encodages ne peuvent pas représenter tous les caractères Unicode, si la substitution se produira pour un tel personnage dans votre DataTable.

Le rendu comme  ° doit être blâmés sur le spectateur/éditeur que vous utilisez pour afficher le fichier.

En savoir plus: https://stackoverflow.com/a/17269952/1132334