A
63 a
? karaktert jelenti.
Ez az amit például akkor látsz az egyes (nemzeti) karakterek helyén a böngésződben ha egy weblap karakterkódolása hibásan van megadva (vagy sehogy) és e miatt nem értelmezhető megfelelően a jelsorozat.
A Lazarus a karakterláncokat (string-eket) UTF-8 kódolással kezeli belső használatra, de az operációs rendszerből érkező és oda küldött karaktereket a helyzetnek (rendszer kódolása) megfelelően kódolja.
Az UTF-8 karakterek közül egyesek (nemzeti és speciális) nem egy bájton hanem többön is (általában kettő) kerülnek tárolásra.
A kódodban egyszerű, egy bájton elhelyezkedő karaktereket vár az eljárásod (
OnKeyPress
), ami a magyar ékezetes karakterek esetén nem kódolható át, lévén ezek az UTF-8-ban két bájton vannak tárolva.
Ajánlom figyelmedbe az
OnUTF8KeyPress
eseménykezelőt, mellyel megfelelően kezelheted az ilyen karaktereket. Az eljárás egy karakterláncban (string) kapja meg a leütött billentyűhöz tartozó UTF-8 karaktert. A benne található bájtokra pedig úgy hivatkozhatsz mint egy hagyományos string egybájtos karaktereire:: UTF8Key[1] + UTF8Key[2]
Ennek kipróbálásához készíts egy TForm-ot két TMemo-val.
A Memo1 esetnén az OnKeyPress, a Memo2 esetén az OnUTF8KeyPress eseménykezelőt hozd létre.
Az eljárások tartalma az alábbi legyen (a te kódod alapján írtam):
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: char);
begin
//Edit1.Text:=Cberedeti.Text + ' : ' + IntToStr(Byte(Key));
Memo1.Text := Memo1.Text + ' : #' + IntToStr(Byte(Key)) + ' ';
end;
procedure TForm1.Memo2UTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
var I:Integer;
begin
Memo2.Text := Memo2.Text + ' : ';
for I:=1 to Length(UTF8Key) do
Memo2.Text := Memo2.Text + '#' + IntToStr(Byte(UTF8Key[I])) + ' ';
end;
Ha most ugyanazt begépeled mindkét Memo-ba láthatod a különbséget