Dans Delphi 7, string
est un alias pour AnsiString
, qui code les caractères Unicode en octets de 8 bits à l'aide de pages de code Windows. Dans certaines pages de code MBCS, les caractères Unicode peuvent nécessiter plusieurs octets (le turc n'en fait cependant pas partie).
Microsoft a plusieurs pages de code pour le turc:
- 857 (MS-DOS)
- 1254 (Windows)
- 10081 (Macintosh)
- 28599 (ISO-8859-9)
Dans les deux pages de code 1254 et 28599 (où 1254 est le plus probable que vous rencontrerez), le caractère Unicode les éléments en question sont codés en 8 bits sous la forme d'hex $FE
(ş
), $F0
(ğ
) et $FD
(ı
).
Assurez-vous que votre variable de chaîne sText
contient en fait ces octets pour commencer, et non octets ASCII $73
(s
), $67
(g
) et $69
(i
) au lieu. S'il contient ce dernier, vous perdez les données turques avant même d'atteindre Canvas.TextOut()
. Ce serait un problème plus tôt dans votre code.
Toutefois, si sText
contient les octets corrects, le problème doit être du côté du système d'exploitation, comme TCanvas.TextOut()
est juste une enveloppe mince pour l'API Win32 ExtTextOutA()
fonction, où sText
est transmis en l'état à l'API. Peut-être que la police que vous utilisez ne supporte pas le turc, ou au moins ces caractères particuliers. Ou peut-être qu'il y a un problème avec le pilote d'imprimante. De toute façon, vous pourriez avoir à recourir à la conversion de votre valeur sText
à un WideString
en utilisant MultiByteToWideChar()
puis appelez ExtTextOutW()
(non ExtTextOutA()
) directement, par exemple:
var
wText: WideString;
size: TSize;
begin
//Printer.Canvas.TextOut(x, y, sText);
SetLength(wText, MultiByteToWideChar(1254{28599}, 0, PAnsiChar(sText), Length(sText), nil, 0));
MultiByteToWideChar(1254{28599}, 0, PAnsiChar(sText), Length(sText), PWideChar(wText), Length(wText)));
Windows.ExtTextOutW(Printer.Canvas.Handle, x, y, Printer.Canvas.TextFlags, nil, PWideChar(wText), Length(wText), nil);
size.cX := 0;
size.cY := 0;
Windows.GetTextExtentPoint32W(Printer.Canvas.Handle, PWideChar(wText), Length(wText), size);
Printer.Canvas.MoveTo(x + size.cX, Y);
end;
Insister sur l'utilisation du texte encodé ANSI en 2016 est stupide. –
Quand je google TURKISH_CHARSET je trouve que cela correspond à la page de code 1254. Quand je google code page 1254, je vois une table de caractères. Il semble que les codes pour ces caractères sont $ FE, $ F0 et $ FD. –
TextOut prend un paramètre de chaîne qui, dans Delphi 7, signifie "résister à l'erreur". Chaque personnage d'une interview est un octet. –