2010-05-18 22 views
1

J'ai l'application console. écrit en Delphi 2010. Sa sortie est prise en charge par Unicode. (J'ai utilisé UTF8Encode et SetConsoleOutputCP (CP_UTF8) pour cela). Lorsque j'exécute le programme à partir de l'invite de commande, cela fonctionne très bien.
Maintenant, je veux lire la sortie d'un autre programme qui a été créé en Delphi 5. J'utilise la méthode this. Mais j'ai des problèmes avec les caractères Unicode.
Quelqu'un at-il une recommandation pour lire la sortie Unicode de l'application console. de Delphi 5?Lire la sortie Unicode de l'application console

+0

Dans cette question, il semble y avoir un tampon: pchar qui devrait être un tampon: pansichar. Pour le reste, je ne comprends pas quel est le problème exact, pourriez-vous détailler plus ce que vous avez? –

Répondre

-1

J'ai changé somethings comme suit et il fonctionne très bien:
En application de la console, je n'ai pas utilisé SetConsoleOutputCP (CP_UTF8). Utilisez uniquement la sortie de chaîne ...
Et à l'autre programme (Delphi 5), j'utilise la fonction this sans utiliser OemToChar (Tampon, Tampon)

+0

-1, La question demande comment lire les données Unicode avec D5. Cette réponse n'implique pas unicode du tout. –

0

Vous avez deux problèmes en utilisant Delphi 5 avec la sortie Unicode. Le premier est TMemo ne supporte pas les caractères Unicode dont vous aurez besoin pour trouver un autre contrôle, comme ceux de TMS Unicode Component Pack. Cependant, ce pack de composants ne supporte pas Delphi 5.

Le deuxième problème est avec cette partie du code:

repeat 
    BytesRead := 0; 
    ReadFile(ReadPipe,Buffer[0], 
    ReadBuffer,BytesRead,nil) ; 
    Buffer[BytesRead]:= #0; 
    OemToAnsi(Buffer,Buffer) ; 
    AMemo.Text := AMemo.text + String(Buffer) ; 
    until (BytesRead < ReadBuffer) ; 

Il est en train de lire, il personnages et de les placer dans le tampon qui est un PCHAR (caractère par octet dans D5) Ensuite, tapez la conversion en une chaîne qui est une AnsiString en D5.

Bien que je n'ai pas utilisé D5 depuis des années, le seul type dont je peux me souvenir capable de gérer les données Unicode dans D5 est WideString.

+0

Je continue de travailler avec D5. Il a en effet le support WideString/Unicode. Cependant, WideStrings est codé en UTF-16, UTF-16-LE pour être plus précis. N'a pas trouvé de support UTF-8 natif dans D5. La recherche de l'aide D5 n'indique rien, pas plus qu'une recherche des sources D5. –

+0

@Marjan: La conversion UTF-16-LE en UTF-8 et vice versa n'est pas un gros problème, même si elle ne fait pas partie du D5 RTL.Les sources dxgettext ont par exemple des routines UTF-8 fonctionnant avec D5. – mghie

1

Delphi 5 prend en charge unicode, mais uniquement via WideStrings codé en UTF-16 (-LE). Nativement, D5 n'a pas de support UTF-8.

Vous pouvez lire la sortie de votre application de console D2010 comme vous le faites déjà, bien que je supprime la conversion OemToAnsi. OEMToAnsi a été remplacé (même dans D5 jours) par OEMToChar qui peut être utilisé pour convertir des caractères OEM en Ansi (caractères à un octet en utilisant différentes pages de code) ou WideString (UTF-16-LE Unicode), mais il ne fera rien interpréter les octets UTF-8 entrant et pourrait juste gâcher les choses. Ce dont vous avez besoin est un ensemble de fonctions qui peut prendre tous les octets utf-8 "raw" que vous avez lus du tube et les convertir en WideStrings (codés en UTF-16-LE) que vous pouvez ensuite alimenter en un contrôle qui peut prendre et montrer WideStrings. Alternativement, vous pouvez rechercher un contrôle qui fait l'interprétation des octets "raw" et la conversion tout seul, mais je dois admettre que je n'ai pas vu un seul qui supporte encore D5.

Une bibliothèque qui peut convertir de nombreux codages différents et supporte encore D5 est DIUnicode: http://www.wikitaxi.org/delphi/doku.php/products/unicode/index