EASY Geschrieben 11. Februar Geschrieben 11. Februar (bearbeitet) Hallo @Neo, das einzige große Problem, das ich mit der Schnittstelle momentan habe ist, daß Umlaute und Sonderzeichen als \uxxxx dargestellt werden. Ich habe die Verbindung zum MBS im Visual Studio (VB), ZeroBrane Studio (lua) und mit PuTTY aufgebaut und komme immer zum gleichen Ergebnis. Da ich mir nicht anders zu helfen wußte, habe ich mir z.B. im Visual Studio einen "Übersetzer" gebastelt... If Result.Contains("\u") Then Dim s As String = Result Dim b As String Dim c As New List(Of String) c = Split(s, "\u").ToList For i = 0 To c.Count - 1 b = c(i) If i > 0 Then Dim h As String = b.Substring(0, 4) c(i) = c(i).Replace(h, Char.ConvertFromUtf32(Convert.ToInt32(h, 16))) End If Next Result = String.Join("", c) End If ... was prinzipiell natürlich nur eine Notlösung ist. Woran kann das liegen? (ich habe in keinem anderen Programm ein Problem mit Umlauten und Sonderzeichen...) [Windows 11 pro] Gruß EASY Bearbeitet 11. Februar von EASY
gmd Geschrieben 11. Februar Geschrieben 11. Februar Easy, nicht visual basic aber dies ist meine connect function public static async Task ConnectAsync() { try { lock (_lock) { if (_tcpClient != null && _tcpClient.Connected) { return; // Already connected } } _tcpClient = new TcpClient(); await _tcpClient.ConnectAsync(_host, _port); var networkStream = _tcpClient.GetStream(); _writer = new StreamWriter(networkStream, Encoding.UTF8) { AutoFlush = true }; _reader = new StreamReader(networkStream, Encoding.UTF8); } catch (Exception ex) { throw new Exception($"Error connecting to server: {ex.Message}", ex); } } Encoding.UTF8 ist hier der punkt .. Latin1 funktioniert glaube ich auch .. Du musst deinem programm sagen was fuer zeichenencoding zu erwarten ist. gruss Gmd
EASY Geschrieben 11. Februar Autor Geschrieben 11. Februar (bearbeitet) Hallo, vor 4 Stunden schrieb gmd: Encoding.UTF8 ist hier der punkt .. Latin1 funktioniert glaube ich auch .. Du musst deinem programm sagen was fuer zeichenencoding zu erwarten ist. Die Codierung ist (bei mir) leider egal... Dim C_Client As Net.Sockets.TcpClient 'Kommando-Client Dim C_Stream As NetworkStream 'Kommando-Stream Dim C_Write As StreamWriter 'Kommando schreiben Dim C_Read, As StreamReader 'Kommando Ergebnis lesen Public Function Connect(Optional IP As String = "127.0.0.1", Optional Port1 As Integer = 31385) As Boolean C_Client = New Net.Sockets.TcpClient Try C_Client.Connect(IP, Port1) ' C_Client verbindet sich über IP / Port1 C_Stream = C_Client.GetStream ' Stream1 wird auf C_Client verwiesen C_Write = New StreamWriter(C_Stream, Encoding.UTF8) ' Stream1 zum Senden wird deklariert C_Read = New StreamReader(C_Stream, Encoding.UTF8) ' Stream1 zum Empfangen wird deklariert Console.WriteLine("Codierung= " & C_Read.CurrentEncoding.ToString) Catch ex As Exception CE_Error = ex 'Systemfehlermeldung zwischenspeichern Return False End Try Return True End Function Console.WriteLine("Codierung= " & C_Read.CurrentEncoding.ToString) liefert Codierung= System.Text.UTF8Encoding (was so sein soll) Wenn ich nun das Kommando "editor.getSelectedEntities" sende (Objektname "Quäsßter") und mir durch... Console.WriteLine("Codierung= " & C_Read.CurrentEncoding.ToString) Console.WriteLine("Result=" & C_Read.ReadLine) Console.WriteLine("Codierung= " & C_Read.CurrentEncoding.ToString) Console.WriteLine("Quäsßter") ... das Ergebnis anzeigen lasse, habe ich dieses Resultat... Zitat Codierung= System.Text.UTF8Encoding Result={"jsonrpc":"2.0","result":[{"_class":"entity","name":"Qu\u00E4s\u00DFter"}],"id":1} Codierung= System.Text.UTF8Encoding Quäsßter Console.WriteLine("Codierung= " & C_Read.CurrentEncoding.ToString) liefert Codierung= System.Text.UTF8Encoding... ...liefert das richtige Ergebnis... nur der Antwortstring ist immer noch falsch und an der Console kann es auch nicht liegen da mit Console.WriteLine("Quäsßter") richtig geschrieben wird... ... bin etwas ratlos Gruß EASY Bearbeitet 11. Februar von EASY
gmd Geschrieben 11. Februar Geschrieben 11. Februar ok, zu spaet fuer heute .. kann nicht mehr richtig denken... ich schau mir morgen mall beispiele an wie das bei mir kommt .. Ich hatte beim einlesen von files einiges zu probieren, ich muss mal explizit umlaute schicken ueber die schnittstelle.. das kann ich ja noch probieren. Gruss Gmd
gmd Geschrieben 11. Februar Geschrieben 11. Februar alte schnittstelle .. als selektion eingelesen und hier ueber die neue das ist mit meiner app gemacht .. muss ich genauer untersuchen was bei dir daneben gehen koennte aber erst morgen gruss Gmd
gmd Geschrieben 11. Februar Geschrieben 11. Februar Probier einfach mal Latin1 statt UTF8, just for fun Gruss Gmd
gmd Geschrieben 11. Februar Geschrieben 11. Februar (bearbeitet) Mein response string Name Value Type responseJson "{\"jsonrpc\":\"2.0\",\"result\":[{\"_class\":\"entity\",\"name\":\"Qu\\u00E4s\\u00DFter\"}],\"id\":1}" string genau wie bei dir, das ist das rohformat und ich mache das var response = JsonConvert.DeserializeObject<JsonRpcResponse>(responseJson); if (response != null) { if (response.Error != null) { ResultMessage = $"Error: {response.Error.Message} (Code: {response.Error.Code})\nRaw Response:\n{responseJson}"; } else if (response.Result == null) { ResultMessage = $"Script executed successfully with no return value.\nRaw Response:\n{responseJson}"; } else { ResultMessage = $"Response: {response.Result}\nRaw Response:\n{responseJson}"; } } else { ResultMessage = $"Failed to parse server response.\nRaw Response:\n{responseJson}"; } $"{response.Result}" gibt den richtigen string mit umlauten gruss Gmd Edit: Bevor du fragst welche Library - using Newtonsoft.Json; Bearbeitet 11. Februar von gmd
gmd Geschrieben 11. Februar Geschrieben 11. Februar (bearbeitet) Das ist noch wichtig fuer die deserialisation Das sind meine custom classes die du im obigen code verwendet siehst namespace NLua_Integration.Json_Classes { [JsonConverter(typeof(JsonRpcMessageConverter))] public class JsonRpcMessage { [JsonProperty("jsonrpc")] public string JsonRpc { get; set; } = "2.0"; [JsonProperty("method")] public string Method { get; set; } [JsonProperty("params")] public string Params { get; set; } // Lua script or other parameters [JsonProperty("id")] public int Id { get; set; } } public class JsonRpcResponse { [JsonProperty("jsonrpc")] public string JsonRpc { get; set; } [JsonProperty("result")] public object Result { get; set; } // Success result [JsonProperty("error")] public JsonRpcError Error { get; set; } // Error details [JsonProperty("id")] public int? Id { get; set; } // Nullable to handle 'null' in the response } public class JsonRpcError { [JsonProperty("code")] public int Code { get; set; } [JsonProperty("message")] public string Message { get; set; } [JsonProperty("data")] public object Data { get; set; } // Optional additional data } } public class JsonRpcMessageConverter : JsonConverter<JsonRpcMessage> { public override void WriteJson(JsonWriter writer, JsonRpcMessage value, JsonSerializer serializer) { writer.WriteStartObject(); // Write jsonrpc writer.WritePropertyName("jsonrpc"); writer.WriteValue(value.JsonRpc); // Write method writer.WritePropertyName("method"); writer.WriteValue(value.Method); // Write params (ensure no extra escaping) writer.WritePropertyName("params"); writer.WriteValue(value.Params); // Ensure proper escaping for the Lua script // Write id writer.WritePropertyName("id"); writer.WriteValue(value.Id); writer.WriteEndObject(); } public override JsonRpcMessage ReadJson(JsonReader reader, Type objectType, JsonRpcMessage existingValue, bool hasExistingValue, JsonSerializer serializer) { // Implement if deserialization is needed throw new NotImplementedException(); } } Bearbeitet 11. Februar von gmd
gmd Geschrieben 11. Februar Geschrieben 11. Februar (bearbeitet) Ich kann dir auch mal die source files schicken, wenn das einfacher ist. Gruss Gmd in meinem logger sieht man die umlaute encoded, und wenn sie dann umgewandelt sind Ich kann die events zerlegen und in eine freundlcihere darstellung umwandeln und die entities extrahieren und filtern usw. Wenn du interesse hast schicke ich dir das gerne .. sollte sich leicht transferieren lassen gruss Gmd Bearbeitet 11. Februar von gmd
EASY Geschrieben 11. Februar Autor Geschrieben 11. Februar Hallo @gmd, vielen Dank für Deine bisherigen Antworten... ich fühle mich momentan etwas überfordert (gleichzeitig bin ich aber auch neugierig geworden, da ich mich auch gerne mit zuerst Unbekanntem beschäftige). Erst einmal kleine Schritte (für Hobbyprogrammierer wie mich)... vor 1 Stunde schrieb gmd: Mein response string Name Value Type responseJson "{\"jsonrpc\":\"2.0\",\"result\":[{\"_class\":\"entity\",\"name\":\"Qu\\u00E4s\\u00DFter\"}],\"id\":1}" string genau wie bei dir, das ist das rohformat da würde mich einmal Interessieren, was @Neo dazu sagt. Ist das "normal" zu erwarten, oder gibt es da noch eine Verbesserung? vor 1 Stunde schrieb gmd: Edit: Bevor du fragst welche Library - using Newtonsoft.Json ... auf die bin ich auch schon gestoßen. Ich muß mich allerdings erst einmal damit beschäftigen, wie ich das in mein Projekt mit einbinden kann... vor einer Stunde schrieb gmd: Ich kann die events zerlegen und in eine freundlcihere darstellung umwandeln und die entities extrahieren und filtern usw. Wenn du interesse hast schicke ich dir das gerne .. sollte sich leicht transferieren lassen Da ich neugierig bin, habe ich schon Interesse. Ich weiß nur nicht, ob das etwas viel auf einmal ist und ich erst einmal viel mehr Fragen als Antworten habe... Gruß EASY
EASY Geschrieben 11. Februar Autor Geschrieben 11. Februar Hallo @gmd, ich muß wohl eigene Wege gehen. Wie es aussieht geht die Library Newtonsoft.Json nicht unter VB. Wenn ich etwas daraus aufrufe kommt folgende Meldung: Zitat ... Newtonsoft.Json.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert Gruß EASY
gmd Geschrieben 11. Februar Geschrieben 11. Februar (bearbeitet) 3 hours ago, EASY said: Hallo gmd, ich muß wohl eigene Wege gehen. Wie es aussieht geht die Library Newtonsoft.Json nicht unter VB. Wenn ich etwas daraus aufrufe kommt folgende Meldung: Gruß EASY "Nur eigenen Code ist aktiviert." Die Option "Just My Code" (Nur eigenen Code debuggen) ist in Visual Studio aktiviert. Dadurch werden externe Bibliotheken wie Newtonsoft.Json ignoriert, und man kann nicht hineinspringen. Das is nur eine warnung dass du das nicht debuggen kannst, wird aber die funktion nicht beeinflussen. Du kannst die source laden zum debuggen, brauchst du aber nicht wirklich, das VS auf decompiled falls noetig. Tools - Options -> Debugging deselect Enable Just My Code warning is ticked, deswegen bekommst du die meldung. Gruss Gmd PS: wir koennen gerne per email oder auch whatsapp communizieren wenn du willst, kein problem, dann belasten wir das forum nicht mit diesen dingen Bearbeitet 11. Februar von gmd
streit_ross Geschrieben 11. Februar Geschrieben 11. Februar Hallo @gmd, Ich verfolge nun schon von Anfang an Deine Aktivitäten hier im MBS. Das ich bis heute nicht verstanden habe, dass das, was Du machst, das MBS nutzerfreundlicher machen könnte, liegt nur an meinem fehlenden Kenntnisstand in Sachen Programmierung. Mal angenommen, Du bist an Deinem Ziel angekommen. Wird dann der Autor der Software vor die Wahl gestellt oder die Alternative haben, eine Version ohne Deinen "Mehrwert" oder wie ich es nennen soll, anzubieten ? Der Nutzer des MBS, also auch ich, denkt ja auch immer an die Kosten einer neuen Version. Es kann allerdings auch sein, das ich mit meiner Frage völlig dabenen liege. Mit freundlichem Gruß streit_ross
gmd Geschrieben 11. Februar Geschrieben 11. Februar Was ich tue sollte Neo ueberhaupt nicht beeinflussen in seiner entwicklungsrichtung, zumindest fuer einige zeit. Was ich tue ist "einfach" ein riesiges plugin und eine experimentelle entwicklung. Weder wird es die kosten des MBS erhoehen noch verringern. Wenn durch dies entwicklung und die diskussionen ideen entstehen die unmittelbar fuer das Mbs nuetzlich sind, kann und wird Neo diese aufgreifen und umsetzen. Wird am ende meine vision wahr, wird das werbung fuer das MBS sein und ein modul welches kostenfrei von jedem verwendet werden kann, falls es jemals dazu kommt das ganze installierbar zu machen und mit weniger resourcen auszukommen als bisher. Fuer jetzt ist das ein versuch und wer moechte kann daran teilnehmen, die source ist offen. Ich hoffe ich habe das verstaendlich formuliert. Gruss Gmd
Neo Geschrieben 12. Februar Geschrieben 12. Februar vor 17 Stunden schrieb EASY: Ist das "normal" zu erwarten, oder gibt es da noch eine Verbesserung? Das Encodieren von Sonderzeichen ist bei JSON standardisiert (siehe Kapitel 2.5 Strings). Die Antworten von der Steuerschnittstelle sind daher normales JSON. Wie verarbeitest du die JSON-Antworten, nutzt du eine spezielle Bibliothek? Viele Grüße, Neo
EASY Geschrieben 12. Februar Autor Geschrieben 12. Februar Hallo, vor 8 Stunden schrieb Neo: Das Encodieren von Sonderzeichen ist bei JSON standardisiert (siehe Kapitel 2.5 Strings). Die Antworten von der Steuerschnittstelle sind daher normales JSON. Wie verarbeitest du die JSON-Antworten, nutzt du eine spezielle Bibliothek? ... Deine Antwort bringt mich nicht so richtig weiter. Wenn ich mir das Kapitel 2.5 durchlese, bin ich offen gestanden nur unwesentlich schlauer (ich bin kein Programmierer) Ich entnehme Deiner Antwort, daß es eben so ist, daß im string den die Schnittstelle sendet, Sonderzeichen und Umlaute als \uxxxx dargestellt werden... (weil "normales JSON"). Für die Verarbeitung verwende ich keine spezielle Bibliothek. Ich nehme den Antwortstring und da dieser im Aufbau einer gewissen Logik folgt, extrahiere ich mir daraus die für mich notwendigen Informationen... Gruß EASY
EASY Geschrieben 12. Februar Autor Geschrieben 12. Februar (bearbeitet) Hallo @Neo, Es ist mir gelungen, die Newtonsoft.Json Bibliotek unter VB zum laufen zu bringen. Damit erledigt sich für mich das Problem mit den Umlauten und Sonderzeichen. Sie werden dort dann richtig dargestellt. Gruß EASY Bearbeitet 12. Februar von EASY
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren
Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen.
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden