Problem mit Multibyte-Zeichen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem mit Multibyte-Zeichen

Beitrag von theo »

Patito hat geschrieben:@Theo: Wenn man schon so viel Aufwand betreibt, dass man Sachen umcodiert, sollte es dann doch wenigstens richtig funktionieren.
Heutzutage voll auf UCS-2 abzufahren ist doch kein Hausgebrauch, sondern eher häusliche Gewalt.

Deine Lösung kann man zwar als schnelle Bastellösung durchgehen lasser, aber insgesamt würde ich doch eher "Daumen runter" dazu sagen.


Warum wirst du jetzt pampig? Hast du einen Vorschlag?
Du kannst gerne meinen TUniString verwenden, der benutzt durchgehend UTF-8 viewtopic.php?f=29&t=5894&p=54025
Zur Normalisierung habe ich auch was: http://wiki.freepascal.org/Theodp

Und P.S: Es ist schon irgendwie auch merkwürdig, dass alle Leute denen es bisher komplett egal war, ob ihr Prog. im Nachbarland Polen funktioniert, jetzt plötzlich alle Lösungen die nur den BMP abdecken als unbrauchbar taxieren.

Dee
Beiträge: 54
Registriert: Do 10. Jul 2014, 20:56
OS, Lazarus, FPC: Windows 10 Pro 64-bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: Ryzen 5 2600

Re: Problem mit Multibyte-Zeichen

Beitrag von Dee »

Es funktioniert nicht. Das Resultat bleibt das gleiche. Wenn eine Methode einen Char als Parameter erwartet, .

Beispiel:

Code: Alles auswählen

 
procedure ShowChar(c: Char);
begin
  ShowMessage(c)
end;         
 
procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  c: Char;
begin
  s := UTF8Decode('äüö');
  c := s[1];
  ShowChar(UTF8Encode(AnsiString(c))[1])
end;
 


Das Zeichen muss sich doch in einer Char-Variable speichern lassen, ohne, dass man beim Auslesen codieren muss.

PS: Woher bekommt man die neueste Version vom FPC? Ist es sinnvoll eine neuere Version zu nutzen? Wenn schon 2.7.1 veröffentlicht wurde, warum wird diese Version nicht mit dem neusten Installer von Lazarus installiert?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Problem mit Multibyte-Zeichen

Beitrag von Michl »

Bitte bedenke, dass nur Chars bis Byte 127 auf "allen" Rechnern der Welt gleich sind, Byte 128..255 sind je nach Codepage anders definiert! Verwendest Du auf Deinem Rechner Codepage 850 oder 437 könntest Du Dein Char (wenn es unbedingt ein 8-Bit-Char sein muss) wie folgt übergeben:

Code: Alles auswählen

procedure ShowChar(c: Char);
begin
  ShowMessage(SysToUTF8(c));
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  c: Char;
begin
  s := 'äüö';
  c := UTF8ToSys(s)[1];
  ShowChar(c);
end;         
Generell lege ich Dir nochmals zu Herzen, Dich mit Strings und Charakters zu beschäftigen:
http://www.joelonsoftware.com/articles/Unicode.html
http://wiki.freepascal.org/Character_and_string_types/de

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

BeniBela
Beiträge: 309
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Problem mit Multibyte-Zeichen

Beitrag von BeniBela »

Michl hat geschrieben:Bitte bedenke, dass nur Chars bis Byte 127 auf "allen" Rechnern der Welt gleich sind,


Es sei denn man hat einen EBCDIC Rechner

Dee
Beiträge: 54
Registriert: Do 10. Jul 2014, 20:56
OS, Lazarus, FPC: Windows 10 Pro 64-bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: Ryzen 5 2600

Re: Problem mit Multibyte-Zeichen

Beitrag von Dee »

Die Referenzen habe ich mir schon angesehen, doch helfen sie mir nicht bei meinem Problem. Es gibt auch vordefinierte Methoden, welche Char als Parameter benötigen, wie in meinem Fall die Funktion VkScanCode (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646329%28v=vs.85%29.aspx) in der Windows-Unit.

Wie kann man dieser Funktion nun ein Zeichen wie ä übergeben? Ich habe schon vieles ausprobiert. Codierungs-Funktionen helfen nicht, weil ein String zurückgegeben wird. Wenn man davon dann das 1. Zeichen auslesen will, dann erhält man wieder "nichts".

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Problem mit Multibyte-Zeichen

Beitrag von Michl »

K.A. Bei mir gibt die Funktion eine Word zurück, dessen Lo- und Hi-Byte man auswerten kann. Auch ein 'ä' funktioniert bei mir, mit dem geposteten Code. Ist allerdings Windows-only:

Code: Alles auswählen

uses ..., Windows;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption:=IntToStr(VkKeyScan(UTF8ToSys('ä')[1]));
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: Problem mit Multibyte-Zeichen

Beitrag von theo »

Und dann gibt es auch noch VkKeyScanW, welches mit WideChar funktioniert.

Aber ich persönlich habe immer noch nicht ganz verstanden, was du eigentlich erreichen willst, und warum du so an diesem "Char" hängst. :wink:

Dee
Beiträge: 54
Registriert: Do 10. Jul 2014, 20:56
OS, Lazarus, FPC: Windows 10 Pro 64-bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: Ryzen 5 2600

Re: Problem mit Multibyte-Zeichen

Beitrag von Dee »

theo hat geschrieben:Und dann gibt es auch noch VkKeyScanW, welches mit WideChar funktioniert.

Aber ich persönlich habe immer noch nicht ganz verstanden, was du eigentlich erreichen willst, und warum du so an diesem "Char" hängst. :wink:


VkKeyScanW würde mir auch nicht helfen, da ich nur Zeichen von 32 bis 255 verwende.

Nochmal für alle: Ich habe einen Passwort-Generator entwickelt, mit dem man über virtuelle Tastenhiebe das Passwort eingeben lassen kann, damit Keylogger keine Chance haben, dass eingegebene Passwort auszulesen. Um die virtuellen Tastenhiebe zu realisieren, nutze ich die Methode keybd_event. Um das entsprechende Zeichen des Passwortes einzugeben, nutze ich die Funktion VkScanCode, dessen Wert an keybd_event übergeben wird.
In Delphi ist die Umsetzung sehr simpel, da man nicht konvertieren muss. In Lazarus muss man, allein was die Codierung betrifft, viel beachten. Klar, es ist ja auch dafür gedacht, um für verschiedene Plattformen Programme zu entwickelt.

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: Problem mit Multibyte-Zeichen

Beitrag von Socke »

Dee hat geschrieben:VkKeyScanW würde mir auch nicht helfen, da ich nur Zeichen von 32 bis 255 verwende.

Konvertiere deinen Quelltext doch einfach nach CP-1252. Andernfalls ist das Ä/ä zwar in 32..255 enthalten, passt dann aber nur in Widechar, da ein Char mit dem Wert $C4 bzw. $E4 eine ganz andere Bedeutung hat.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Problem mit Multibyte-Zeichen

Beitrag von Patito »

Dee hat geschrieben:Nochmal für alle: Ich habe einen Passwort-Generator entwickelt, mit dem man über virtuelle Tastenhiebe das Passwort eingeben lassen kann, damit Keylogger keine Chance haben, dass eingegebene Passwort auszulesen. Um die virtuellen Tastenhiebe zu realisieren, nutze ich die Methode keybd_event. Um das entsprechende Zeichen des Passwortes einzugeben, nutze ich die Funktion VkScanCode, dessen Wert an keybd_event übergeben wird.
In Delphi ist die Umsetzung sehr simpel, da man nicht konvertieren muss. In Lazarus muss man, allein was die Codierung betrifft, viel beachten. Klar, es ist ja auch dafür gedacht, um für verschiedene Plattformen Programme zu entwickelt.


Wenn man mit der Codierung Probleme hat, sollte man erst mal zwei Dinge klären:
1) Welche Codierung hat der vorliegende Text
2) Welche Codierung will ich haben.

Dann sucht man sich eine passende Konvertierungsmethode aus.

VKKeyScan benötigt vermutlich ein einzelnes Byte mit einem Encoding aus der System-Codepage. (auf einem chinesischen Windows wird es damit wohl eher nicht funktionieren)
VKKeyScanW benötigt vermutlich UCS-2.

Zum Debuggen ist es unpraktisch zu versuchen die Buchstaben per ShowMessage anzuzeigenm, da man sie dazu in das String-Format umkonvertieren muss, das ShowMessage braucht. Wenn man Debuggen will, sollte man lieber schauen was für Bytes man wirklich hat und nicht noch eine weitere Konvertierung zwischenschalten.

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: Problem mit Multibyte-Zeichen

Beitrag von Socke »

Patito hat geschrieben:VKKeyScanW benötigt vermutlich UCS-2.

Microsoft ist mittlerweile auf UTF-16 umgestiegen; UCS-2 wurde nur bis Windows NT eingesetzt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Problem mit Multibyte-Zeichen

Beitrag von Patito »

Socke hat geschrieben:
Patito hat geschrieben:VKKeyScanW benötigt vermutlich UCS-2.

Microsoft ist mittlerweile auf UTF-16 umgestiegen; UCS-2 wurde nur bis Windows NT eingesetzt.


Hm, probier mal... Die Funktion hat doch nur einen 16-bit Parameter..
Es würde mich sehr wundern, wenn die Tastatureingabe in Windows voll Unicode-fähig wäre.

Antworten