2016-03-21 9 views
0

Ich verwende Regex, um eine Zeichenfolge von Unicode und speichern Sie es in einer Zeichenfolge. Zum Beispiel:C#. NET ist keine russische Zeichen

HINWEIS: Der folgende Inhalt muss aus einer externen Textdatei gelesen werden, da Visual Studio dies automatisch in Russisch rendert.

"Name": "\u0412\u0438\u043d\u043d\u0438\u0446\u0430, \u0443\u043b. \u041a\u0438\u0435\u0432\u0441\u043a\u0430\u044f, 14-\u0431", 

Ich bin mit dem Muster:

"\"Name\":\\s*\"(?<match>[^\"]+)\"" 

Allerdings, wenn ich das Spiel in einer Zeichenfolge zu speichern, wird die Zeichenfolge gespeichert als:

match = "\\u0412\\u0438\\u043d\\u043d\\u0438\\u0446\\u0430, \\u0443\\u043b. \\u041a\\u0438\\u0435\\u0432\\u0441\\u043a\\u0430\\u044f, 14-\\u0431" 

.NET die Speicherung Zeichenkette mit einem zusätzlichen "\"

Ich versuchte mit:

match = match.replace(@"\\", @"\") 

aber .NET erkennt @ "\\" nicht als vorhanden, da es sich um die "Visualizer-Version" handelt.

Wie kann ich meinen Unicode speichern, ohne ein zusätzliches '\' hinzuzufügen?

EDIT: Ein weiterer Punkt:

// this works! 
string russianCharacters = "\u041b\u044c\u0432\u043e\u0432, \u0414\u043e\u043b\u0438\u043d\u0430, \u0432\u0443\u043b. \u0427\u043e\u0440\u043d\u043e\u0432\u043e\u043b\u0430, 18"); 

Dies macht richtig in dem Visualizer als russische Zeichen. Aber wenn ich Zeichen aus einem regulären Ausdruck von einer externen Textdatei speichern, wird es als eine excaped Sequenz gespeichert.

Wie kann ich meine Zeichenfolge als russische Zeichen anstelle einer Escape-Sequenz von Unicode rendern?

+2

Ähm, nein. .NET macht so etwas nicht. Vielleicht sind Sie verwirrt, weil der Debugger * * .NET-Zeichenfolgen anzeigt? Versuchen Sie stattdessen, die Zeichenfolge in eine reine Textdatei zu speichern, und Sie werden sehen, wie sie tatsächlich aussieht (verwenden Sie 'Encoding.Unicode', um sicher zu sein).Das '\\' existiert nur im "Visualizer", deshalb können Sie es nicht ersetzen, nicht umgekehrt. .NET schaut nicht auf die "Visualizer" -Version, Sie sind. – Luaan

+2

Nein, ** Sie ** sehen sich die Visualizer-Version an. Es gibt keine doppelten Backslashes. Was willst du erreichen, indem du solche Strings speicherst? – CodeCaster

+2

HTMLDecode arbeitet mit einer Zeichenfolge, die zuvor mit HTMLEncode codiert wurde. Da Ihre Zeichenfolge nicht codiert ist, kann .NET nicht dekodiert werden. siehe https://msdn.microsoft.com/en-us/library/system.web.httputility.htmldecode(v=vs.110).aspx – Saleem

Antwort

2

Es scheint, dass Sie die Zeichenfolge aus einer Textdatei lesen, die tatsächlich wörtliche Unicode Punkte enthalten, nicht unbedingt die Unicode-Zeichen. Das heißt, Ihre C# Variable wie folgt aussieht:

var match = "\\u0412\\u0438\\u043d\\u043d\\u0438\\u0446\\u0430, \\u0443\\u043b. \\u041a\\u0438\\u0435\\u0432\\u0441\\u043a\\u0430\\u044f, 14-\\u0431" 

oder

var match = @"\u0412\u0438\u043d\u043d\u0438\u0446\u0430, \u0443\u043b. \u041a\u0438\u0435\u0432\u0441\u043a\u0430\u044f, 14-\u0431" 

In diesem Fall wird die tatsächliche Unicode-String zu erhalten, müssen Sie Regex.Unescape verwenden:

Wandelt jede entkommen Zeichen in der Eingabezeichenfolge.

C# demo:

var s = "\\u0412\\u0438\\u043d\\u043d\\u0438\\u0446\\u0430, \\u0443\\u043b. \\u041a\\u0438\\u0435\\u0432\\u0441\\u043a\\u0430\\u044f, 14-\\u0431"; 
Console.WriteLine(s); 
// \u0412\u0438\u043d\u043d\u0438\u0446\u0430, \u0443\u043b. \u041a\u0438\u0435\u0432\u0441\u043a\u0430\u044f, 14-\u0431 
Console.WriteLine(Regex.Unescape(s)); 
// Винница, ул. Киевская, 14-б 
+1

Brilliant Lösung speichern! –

3

Das Extra '\' ist nur ein Escape-Zeichen. Ich schätze, Sie sehen den Wert im Debugger-Fenster, in welchem ​​Fall es das zusätzliche '\' zeigt, aber der zugrunde liegende Wert wird nicht das zusätzliche '\' haben. Versuchen Sie es mit dem tatsächlichen Wert und Sie werden dies sehen.

Dieser Code funktioniert wie erwartet:

var myString = "\"Name\": \"\u0412\u0438\u043d\u043d\u0438\u0446\u0430, \u0443\u043b.\u041a\u0438\u0435\u0432\u0441\u043a\u0430\u044f, 14 - \u0431\","; 
var pattern = "\"Name\":\\s*\"(?<match>[^\"]+)\""; 
Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase); 
MatchCollection matches = rgx.Matches(myString); 

if (matches.Count > 0) 
{ 
    foreach (Match match in matches) 
    { 
     var ma = System.Web.HttpUtility.HtmlDecode(match.ToString()); 
    } 
} 
+0

Wie kann ich den Unicode korrekt als russische Zeichen darstellen? Der Visualizer zeigt \ u0412 \ u0438 \ u043d \ u043d \ u0438 \ u0446 \ u0430, \ u0443 \ u043b. \ u041a \ u0438 \ u0435 \ u0432 \ u0441 \ u043a \ u0430 \ u044f, 14- \ u0431 das ist richtig, aber ich möchte, dass die Zeichenfolge tatsächlich russische Zeichen dargestellt werden – Mike

+0

Ich habe etwas Testcode hinzugefügt und es funktioniert wie erwartet. –

+0

Immer noch nicht für mich arbeiten. In Ihrem Beispiel wird myString automatisch in russische Zeichen gerendert. Aber es passt Ihre Regex zu einer externen Textdatei, es wird als eine Eskorte Unicode-Sequenz und nicht wirklich russische Zeichen – Mike

Verwandte Themen