2017-04-05 3 views
0

Ich möchte die Replace() -Methode, sondern Hex-Werte anstelle von String-Wert verwenden.Replace() arbeiten mit Hex-Wert

Ich habe ein Programm in C#, die Textdatei schreiben.

Ich weiß nicht warum, aber wenn das Programm die '°' (-> Nummer) schreibt, ist es wrotte ° (in Hex: C2 B0 statt B0).

Ich möchte es nur patch, um dies zu korrigieren.

Ist es möglich, zu ersetzen, um C2B0 durch B0 zu ersetzen? Wie geht das?

Vielen Dank :)

+0

Warum nicht 'Replace()' Arbeit? 'yourString.Replace ((char) 0xC2B0, (char) 0xB0);' – Equalsk

+0

Es ist nicht klar, was Sie hier mit "in hex" meinen. Wenn Sie meinen, dass dies die Daten in der Textdatei sind, wenn Sie sie als * binary * betrachten, sollten Sie die Daten wahrscheinlich zunächst als Binärdaten behandeln. Meine Vermutung ist, dass Sie nicht wirklich meinen [U + C2B0] (http://www.fileformat.info/info/unicode/char/c2b0/index.htm). –

+0

Dies ist kein Ersatzkandidat, sondern ein Codierproblem (Unicode <> ANSI). Welche Anwendung macht dies als "°"? Können Sie ein minimales Beispiel für den Code anzeigen, der in die Datei schreibt? – dlatikay

Antwort

0

Nicht sicher, ob dies die beste Lösung für Ihr Problem ist, aber wenn Sie eine Ersetzen-Funktion für eine Zeichenfolge mit Hex-Werte wollen diese Arbeit:

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

C# Strings sind Unicode. Wenn sie in eine Datei geschrieben werden, muss eine Codierung angewendet werden. Die Standardcodierung, die von File.WriteAllText verwendet wird, ist utf-8 with no byte order mark.

Die Zwei-Byte-Sequenz 0xC2B0 ist die Darstellung des Gradzeichens U + 00B0 Codepunkt in utf-8.

des 0xC2 Teils loszuwerden, eine andere Codierung, zum Beispiel Latin-1 gilt:

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

Um die "hex ersetzen" Idee der Frage zu befassen: Best Practice die utf-8 zu entfernen führendes Byte von bestehenden Dateien wäre ein ReadAllText mit utf-8, gefolgt von einem WriteAllText wie oben gezeigt (oder Stream-Chunking, wenn die Dateien zu groß sind, um in den Speicher als Ganzes zu lesen) zu tun.

Einzelbyte-Zeichenkodierungen können nicht alle Unicode-Zeichen darstellen, daher erfolgt die Ersetzung für ein beliebiges Zeichen in Ihrer DataTable.

Die Wiedergabe als  ° muss dem Viewer/Editor angelastet werden, den Sie zum Anzeigen der Datei verwenden.

Weiterführende Literatur: https://stackoverflow.com/a/17269952/1132334