Umlaute in Konsolenanwendung...

Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Umlaute in Konsolenanwendung...

Beitrag von corpsman »

Guten morgen allerseits,

Ich hab mal wieder ein UTF8 / Windows Problem

Das Programm im Anhang zeigt euch die übergebenen Parameter in seiner Konsole an. Das Problem ist nun, dass ich aus dem Program heraus eine Datei öffnen will, welche in einem Ordner mit Umlauten liegt.

Startet ihr das Programm aus der IDE, dann werden die Parameter anders übergeben wie wenn man das Programm mittels der beigefügten .bat datei startet.

Letzendes soll mein Programm nachher mittels Tfilestream die Datei lesen. Aber wenn das Fileexists schon nicht geht ...

Habt ihr noch eine Idee / könnt ihr das nachstellen, dann reporte ich es.

Nutze Hier WinXP, Lazarus revision 39124, FPC 2.7.1 alles in 32-Bit.

Gruß

Corpsman
Dateianhänge
Pröblem.zip
Beispielprojekt
(96.82 KiB) 106-mal heruntergeladen
--
Just try it

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Umlaute in Konsolenanwendung...

Beitrag von mschnell »

Kann das Programm überhaupt wissen, in welchem Code ihm Kommandozeilen-Parameter übergeben werden ?

Windows benutzt als Zeichen-Code normalerweise UTF-16 (o.ä.) als Parameter wird Kommandozeilen-Programmen aber (soweit ich weiß) ein 8-Bit Code übergeben. Vermutlich nicht UTF-8. Vielleicht ANSI entsprechend der System-Landes-Kennung, oder ????

-Michael

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Umlaute in Konsolenanwendung...

Beitrag von corpsman »

Naja meine Hoffnung war so ein bischen, dass wenn ich den Prameter für Fileexists TFilestream von Ausen bekomme er auch immer passend ist so das das Betriebsystem da nichts anprangert. Intern wandle ich den String ja eigentlich auch nicht um.
--
Just try it

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Umlaute in Konsolenanwendung...

Beitrag von mschnell »

corpsman hat geschrieben: Intern wandle ich den String ja eigentlich auch nicht um.


Das wirst Du aber müssen. Der Parameter kommt nicht als UTF-8, sondern vermutlich als ANSI Codepage xyz, das Interface zur LCL ist (im Moment) UTF-8. Also inkompatibel, sobald irgendwelche nicht-ASCII-Zeichen kommen. Du musst also die passende Konvertierungs-Funktion aufrufen (Theo: welche ?!?!?!).

-Michael

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Umlaute in Konsolenanwendung...

Beitrag von theo »

mschnell hat geschrieben:Das wirst Du aber müssen. Der Parameter kommt nicht als UTF-8, sondern vermutlich als ANSI Codepage xyz, das Interface zur LCL ist (im Moment) UTF-8. Also inkompatibel, sobald irgendwelche nicht-ASCII-Zeichen kommen. Du musst also die passende Konvertierungs-Funktion aufrufen (Theo: welche ?!?!?!).


Dieses Prog. hat mit der LCL gar nichts zu tun.
Im Prinzip hat corpsman imho schon recht, dass nichts umgewandelt werden muss.
Ich sehe das Problem nicht.

P.S. Achso, doch der Quelltext ist UTF-8 und dort sind Umlaute hardcoded.
File Settings -> Encoding ändern.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Umlaute in Konsolenanwendung...

Beitrag von mschnell »

Wenn ich den OP richtig verstanden habe, kommt der String aus dem Kommandozeilen-Parameter und wird an an "FielExist" weitergegeben. Da sollte der Code des Quelltext doch keine Rolle spielen.

Gibt es eine definitive Aussage über die Codierung, die bei Paramstr() und bei FileExist() verwendet wird ?

-Michael

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Umlaute in Konsolenanwendung...

Beitrag von Socke »

mschnell hat geschrieben:Gibt es eine definitive Aussage über die Codierung, die bei Paramstr() und bei FileExist() verwendet wird ?

Die gehören zur RTL und verwenden damit die Systemkodierung. Unter Windows ist das zurzeit Einstellungssache (Lokalisierung). Unter Linux eigentlich auch; hier wird in der Regel aber UTF-8 eingesetzt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Umlaute in Konsolenanwendung...

Beitrag von mschnell »

Socke hat geschrieben:Die gehören zur RTL und verwenden damit die Systemkodierung. Unter Windows ist das zurzeit Einstellungssache (Lokalisierung). Unter Linux eigentlich auch; hier wird in der Regel aber UTF-8 eingesetzt.


Welche Systemcodierung ? Wenn ich das richtig sehe gibt es bei Windows quasi alle APIs alternativ mit 8-Bit und mit 16-Bit Strings.

FileExist() und Paramstr() aus der RTL verwenden 8 Bit Strings. Also werden vermutlich die 8-Bit APIs benutzt, also ANSI-Codepage xyz. (Soweit ich weiß, gibt es aber auch ein paar UTF-8 Funktionen in der RTL, die dann auch so heißen)

Wären es nun LCL-Funktionen und nicht RTL-Funktionen würde vermutlich die 16 Bit Windows API verwendet und die (8-Bit-) Strings würden von UTF-8 in 16 Bit UTF-16 (o.ä.) konvertiert. (Der arme Programmierer muss also wissen, ob die verwendete Funktion aus der RTL oder der LCL stammt. :( )

Was das Problem des OP war ist mir dann aber nicht klar.
-Michael

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Umlaute in Konsolenanwendung...

Beitrag von corpsman »

Also eure Diskussion zeigt mir eins, einfach ist es nicht :(.

Was ich machen will ist eigentlich recht simpel

Ich Nutze Synaser um Daten via Uart zu versenden. Diese Daten Lade ich aus einem TStream.

Mein Kommandozeilenprogramm bekommt nun als Parameter die Datei die es zu versenden hat.

Ich muss also in der Lage sein die Datei xyz die ich über Paramstr(i) bekomme an die TFilestream Komponente weiter zu geben und zu laden. Unterwegs will ich noch Kontrollieren ob es die Datei überhaupt gibt. Verwende ich Dateien / Ordner, welche keine Umlaute äöü haben funktioniert alles wunderbar, da hier die Umwandlungsfehler auch nicht sind..

Code: Alles auswählen

 
..
Dateiname := paramstr(i);
..
if Fileexists(Dateiname) then begin
..
  fs := Tfilestream.create(Dateiname, fmopenread);
..
  synaser.sendbytes(...)
..
  fs.free;
end;
 
--
Just try it

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Umlaute in Konsolenanwendung...

Beitrag von theo »

corpsman hat geschrieben:Also eure Diskussion zeigt mir eins, einfach ist es nicht :(.


So schwierig kann's nicht sein. Du neigst manchmal ein bisschen zur Hilflosigkeit. :wink:
Geh doch mal Schritt für Schritt durch und schau, was wo warum welche Kodierung hat.
Mehr als UTF-8 und Latin1 sollte eigentlich nicht vorkommen.
Dann wandle ggf. am geeigneten Ort um mit UTF8ToSys oder SysToUTF8.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Umlaute in Konsolenanwendung...

Beitrag von corpsman »

Naja Hilflos bin ich immer dann wenn alle meine Versuche nichts bringen.

Wie ich schrieb, läuft es ja wenn ich die Parameter via IDE übergebe.

Und selbstverständlich habe ich die diversen utf8tosys und umgekehrt auch schon probiert.

Wie du übrigens hier Nachlesen kannst habe ich dieses Problem öfters. evtl liegt es ja auch an meiner Installierten Version, ..

Habe mir das FPC Buch nun bestellt, evtl. muss ich dann in zukunft weniger fragen *g*.
--
Just try it

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Umlaute in Konsolenanwendung...

Beitrag von theo »

corpsman hat geschrieben:Habe mir das FPC Buch nun bestellt,


Das Buch ist sicher eine gute Idee (habe es selber zwar nicht). Aber ich tippe mal drauf, dass es dieses Problem nicht lösen wird.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Umlaute in Konsolenanwendung...

Beitrag von corpsman »

Aufm Stuttgarter Lazarustreffen lag es aufm Tisch und ich habs mal grob überflogen.
Als Nachschlagewerk und so zum mal durchblättern ist es super. Bisher hatte mich der Preis abgeschreckt. Aber es ist ja Weihnachten *g*.

Sag kannst du meine Fehler nachstellen ? Wenn nicht, welche Compiler / Lazarus Kombination nutzt du. Dann mache ich ein Update.
Unter Linux ist die Update geschichte ja so viel einfacher mit meinem Update skript *g*, da bin ich immer Wochenaktuell.
--
Just try it

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Umlaute in Konsolenanwendung...

Beitrag von theo »

Ich hab mal extra wegen dir Windoof gebootet. :evil:

Irgendwie formulierst du dein Problem nicht aus, deshalb weiss ich auch nicht genau wo dein Problem ist.
Die Konsole muss natürlich die Zeichen erstmal darstellen können.

Mach mal auf der Konsole
chcp 850
und achte darauf, dass das run.bat auch Ansi ist.

Hauptproblem liegt wahrsch. im writeln, nicht in den Strings.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Umlaute in Konsolenanwendung...

Beitrag von corpsman »

*g*

Ja das mit den großen Gedankensprüngen haben mir schon meine Lehrer immer vorgeworfen. Zu Hause hab ich auch kein Windoof, werde morgen testen und dann berichten.

[Edit]

Wie zu erwarten ist meine Codepage bereits auf 850
c:\chcp
Aktive Codepage: 850.
c:\chcp 850
Aktive Codepage: 850.

die run.bat ist ISO8859 codec.
--
Just try it

Antworten