Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Sonderzeichen übermitteln (https://www.delphipraxis.net/193153-sonderzeichen-uebermitteln.html)

codenoob 28. Jun 2017 01:37

Sonderzeichen übermitteln
 
Hi Delphianers

Ich habe folgendes Problem ich versende über mein Netzwerk vom 1.PC auf meinen anderen 2.PC Dateinamen.
Dies funktioniert auch aber sobald ein Dateiname ein sonderzeichen hat wie zb. 'MeineMusikDateiૐ.mp3'
dann empfängt der Client vom Server den Dateinamen so... 'MeineMusikDatei ?.mp3'

Versenden Tue ich im Server so.
Delphi-Quellcode:
var
  FileName : String;

  until Socket.SendBuf(pointer(AnsiString(FileName))^,Length(AnsiString(FileName))) <> -1;
und empfangen im Client so.
Delphi-Quellcode:
var
   FileName : String;

   FileName := string(Socket.ReceiveString);
Woran kann das liegen das die Sonderzeichen nicht korrekt übermittelt werden?

Grüsse Tom

jaenicke 28. Jun 2017 01:56

AW: Sonderzeichen übermitteln
 
Du castest auf AnsiString. Und AnsiStrings können eben keine Unicodezeichen enthalten, da dort nur ein Byte pro Zeichen zur Verfügung steht.

Als Lösung kannst du Utf8Encode zum Umwandeln des Unicodestrings in einen Ansistring / RawString zum Senden und UTF8ToString zum Zurückumwandeln verwenden. UTF-8 verwendet ggf. mehrere Bytes zum Encoding, wie auch Unicode, aber bei UTF-8 werden einfach mehrere Zeichen zum Kodieren eines einzelnen Zeichens verwendet.

codenoob 28. Jun 2017 02:41

AW: Sonderzeichen übermitteln
 
ich habe das nun so versucht aber ich bekomme immer noch das selbe resultat.

der client bekommt nun 'MeinMusikDatei à«?.mp3' und wenn ich das dann mit UTF8ToString wieder zurückwandeln will
bekomme ich wieder 'MeineMusikDatei ?.mp3'

kann es was damit zu tun haben weil der Client in ner Konsole läuft?

mjustin 28. Jun 2017 07:54

AW: Sonderzeichen übermitteln
 
Zitat:

Zitat von codenoob (Beitrag 1375492)
ich habe das nun so versucht aber ich bekomme immer noch das selbe resultat.

der client bekommt nun 'MeinMusikDatei à«?.mp3' und wenn ich das dann mit UTF8ToString wieder zurückwandeln will
bekomme ich wieder 'MeineMusikDatei ?.mp3'

kann es was damit zu tun haben weil der Client in ner Konsole läuft?

Geht es darum, Unicodezeichen in einer Windows Konsole anzuzeigen?
Oder wird der String auf der Client-Seite im Delphi-Debugger nicht korrekt angezeigt?
Wie sieht der Clientseitige Code aus?

codenoob 28. Jun 2017 12:11

AW: Sonderzeichen übermitteln
 
Also meine Form mit den Serversockets versenden den den Dateinamen an meinen client der Konsole ist.
Dies funktioniert auch ausser der Dateiname besteht aus sonderzeichen da kommt beim client eben nicht

'MeineMusikDateiૐ.mp3' an sondern nur 'MeineMusikDatei ?.mp3'

Nach langem Googeln scheint es wohl mit der Konsole an der Konsole zu liegen.

Denn wenn ich das ganze in meiner Server Form mit Utf8Encode(Dateiname) umwandle und verschicket kommt am clent auch 'MeinMusikDatei à«?.mp3'
aber dieser lässt sich danneben nicht mit UTF8ToString oder UTF8Decode wieder zurückwandeln dann hab ich wieder 'MeineMusikDatei ?.mp3'

p80286 28. Jun 2017 16:37

AW: Sonderzeichen übermitteln
 
Zitat:

Zitat von codenoob (Beitrag 1375547)
Denn wenn ich das ganze in meiner Server Form mit Utf8Encode(Dateiname) umwandle und verschicket kommt am clent auch 'MeinMusikDatei à«?.mp3'
aber dieser lässt sich danneben nicht mit UTF8ToString oder UTF8Decode wieder zurückwandeln dann hab ich wieder 'MeineMusikDatei ?.mp3'

Jo, Deine Konsole kann nur Ansi/ASCII (anzeigen) und damit ist es mit den Sonderzeichen Essig.

Gruß
K-H

himitsu 28. Jun 2017 21:29

AW: Sonderzeichen übermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nicht ganz, auch die Console kann Unicode, bzw. UTF-8.
Delphi-Quellcode:
SetConsoleOutputCP(CP_UTF8);

MSDN-Library durchsuchenSetConsoleOutputCP MSDN-Library durchsuchenSetConsoleCP

Standardmäßig ist die Console oftmals mit einem OEM-Charset initialisiert.


Wer sich noch an due Autoexec.bat erinnert.
Auch damals konnte man einen anderen Charset Codepage einstellen (ANSI) und sogar ein paar der 255 Chars nach Belieben pixelweise neu definieren.

jaenicke 29. Jun 2017 14:48

AW: Sonderzeichen übermitteln
 
Zitat:

Zitat von codenoob (Beitrag 1375547)
Denn wenn ich das ganze in meiner Server Form mit Utf8Encode(Dateiname) umwandle und verschicket kommt am clent auch 'MeinMusikDatei à«?.mp3'
aber dieser lässt sich danneben nicht mit UTF8ToString oder UTF8Decode wieder zurückwandeln dann hab ich wieder 'MeineMusikDatei ?.mp3'

Du wirfst Äpfel und Birnen durcheinander. ;-)
Das eine ist die reine Übertragung und die Umwandlung dafür. Das andere ist die Anzeige in der Konsole.

So etwas solltest du schrittweise angehen.
  • Zuerst im Debugger prüfen, ob die reine Übertragung funktioniert. (Haltepunkt setzen und Inhalt der Variablen auswerten.)
  • Und dich erst danach um die Anzeige kümmern, wenn du sicher bist, dass die Übertragung klappt
Denn aktuell kann es noch an vielen Dingen liegen... Variablen mit Typ AnsiString, Fehler bei der Umwandlung und eben auch an der Anzeige in der Konsole. Was davon das Problem ist, lässt sich aus deinen bisherigen Ausführungen nicht ermitteln.

codenoob 29. Jun 2017 17:28

AW: Sonderzeichen übermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also momentan schaut es so aus.

Anhang 47596

wie gesagt so versende ich
Delphi-Quellcode:
var
  FileName : String;

  until Socket.SendBuf(pointer(AnsiString(FileName))^,Length(AnsiString(FileName))) <> -1;
und so empfange ich
Delphi-Quellcode:
var
   FileName : String;

   FileName := string(Socket.ReceiveString);
Wie kann ich denn prüffen ob es überhaupt schon in der Konsole Richtig ankommt und vom der Server Form richtig versendet wird ?

Grüsse Tom

codenoob 29. Jun 2017 17:48

AW: Sonderzeichen übermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab jetzt mal ne neue Konsole gemacht.
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
   MyString : String;

begin
  try

   MyString := 'Mein String mit Sonderzeichen &#2768;';

   writeln(MyString);
   Readln;

    { TODO -oUser -cConsole Main : Code hier einfügen }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
und sogar da gibt er meinen String so aus
Anhang 47598

nahpets 29. Jun 2017 17:59

AW: Sonderzeichen übermitteln
 
Ja, die Konsole hat' nen anderen Zeichnsatz, als z. B. der Editor von Delphi.

Probier' doch mal bitte, ob in Deinem neuen Programm die Ausgabe der Umlaut äöü ... klappt.

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Windows;

function StrOemToAnsi(const S: string): string;
begin
  SetLength(Result, Length(S));
  if S <> '' then OemToAnsiBuff(@S[1], @Result[1], Length(S));
end;

function StrAnsiToOem(const S: string): string;
begin
  SetLength(Result, Length(S));
  if S <> '' then AnsiToOemBuff(@S[1], @Result[1], Length(S));
end;

var
   MyString : String;

begin
  try

   MyString := StrAnsiToOem('Mein String mit Sonderzeichen &#2768;');

   writeln(MyString);
   Readln;

    { TODO -oUser -cConsole Main : Code hier einfügen }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Damit besser?

Wobei ich bezweifle, dass die Konsole das von Dir gewählte Sonderzeichen überhaupt ausgeben kann.

Zum Zeichensatz der Konsole (und dessen Änderung) wurde weiter oben schonmal was geschrieben.

Fritzew 29. Jun 2017 18:22

AW: Sonderzeichen übermitteln
 
Liest Du eigentlich die Antworten?
Die Konsole ist default auf der Codepage des Systems unterwegs

Also erstmal in Deinem Programm vor dem ersten benutzen der Konsole:

SetConsoleOutputCP(CP_UTF8);
oder
SetTextCodePage(Output, CP_UTF8);

und dann ganz wichtig !!!!
Stelle bitte in den Eigenschaften Deiner Konsole auf einen TrueType Font mit UnicodeSupport.
Es werden aber dort nur Fonts mit fester Breite vorgeschlagen, es muss also nicht sein dass alles angezeigt wird.
Aber Anzeige ist nicht gleich Daten.
Und wenn Du auf einer Seite 8 Bit-Strings versendest kannst Du nicht erwarten dass Unicode ankommt, vor allem nicht wenn die Zeichen nicht in eine Codepage passen.

codenoob 29. Jun 2017 18:31

AW: Sonderzeichen übermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wo ändere ich denn die Eigenschaften Konsole?
Bei den Projekt Einstellungen?

Anhang 47599

nahpets 29. Jun 2017 18:49

AW: Sonderzeichen übermitteln
 
Mit dem zwei Post höher zitierten Quelltext?

p80286 29. Jun 2017 19:19

AW: Sonderzeichen übermitteln
 
Zitat:

Zitat von Fritzew (Beitrag 1375661)
Aber Anzeige ist nicht gleich Daten.

:thumb:

K-H

himitsu 29. Jun 2017 19:31

AW: Sonderzeichen übermitteln
 
Zitat:

Zitat von codenoob (Beitrag 1375662)
Wo ändere ich denn die Eigenschaften Konsole?
Bei den Projekt Einstellungen?

Nee, in der Konsole, also im Windows.
Wenn eine Konsole offen ist, dann im Kontextmenü "Eigenschaften" ihrer Titelleiste.

Das war zur Anzeige, also der Teil zwischen der Console und dir.


Bezüglich der Schnittstelle zwischen deinem Programm und der Console.
siehe Posts #7, #11 usw.

jaenicke 29. Jun 2017 20:32

AW: Sonderzeichen übermitteln
 
Zitat:

Zitat von codenoob (Beitrag 1375656)
Wie kann ich denn prüffen ob es überhaupt schon in der Konsole Richtig ankommt und vom der Server Form richtig versendet wird ?

Habe ich ja geschrieben...
Zitat:

Zitat von jaenicke (Beitrag 1375638)
Zuerst im Debugger prüfen, ob die reine Übertragung funktioniert. (Haltepunkt setzen und Inhalt der Variablen auswerten.)


p80286 29. Jun 2017 22:34

AW: Sonderzeichen übermitteln
 
Zitat:

Zitat von codenoob (Beitrag 1375656)
Wie kann ich denn prüffen ob es überhaupt schon in der Konsole Richtig ankommt und vom der Server Form richtig versendet wird ?

Gib "Filename" doch als Hexstring aus.

Gruß
K-H

codenoob 2. Jul 2017 21:14

AW: Sonderzeichen übermitteln
 
Nach langen prüffen meiner Form und meiner Cosole scheint es wohl an dem CreateFile zu liegen das meine Konsole keine Datei mit Sonderzeichen erstellen kann die sie empfängt.

p80286 2. Jul 2017 22:41

AW: Sonderzeichen übermitteln
 
Dann schau mal hier herein:
Zitat:

In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\\?\" to the path. For more information, see Naming Files, Paths, and Namespaces.

For information on special device names, see Defining an MS-DOS Device Name.

To create a file stream, specify the name of the file, a colon, and then the name of the stream. For more information, see File Streams.

Tip Starting with Windows 10, version 1607, for the unicode version of this function (CreateFileW), you can opt-in to remove the MAX_PATH limitation without prepending "\\?\". See the "Maximum Path Length Limitation" section of Naming Files, Paths, and Namespaces for details
Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz