Question

J'ai app de la console. écrit en Delphi 2010. Il est pris en charge de sortie Unicode. (Je UTF8Encode et SetConsoleOutputCP (CP_UTF8) pour cela). Quand je lance le programme de commande rapide, il fonctionne très bien.
Maintenant, je veux lire la sortie d'un autre programme qui a été créé dans Delphi 5 . J'utilise cette méthode . Mais j'ai des problèmes avec des personnages unicode.
Quelqu'un at-il une recommandation de lire la sortie unicode de l'application de la console. de Delphi 5?

Était-ce utile?

La solution 3

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). Seule la sortie de chaîne de l'utilisation ...
Et à l'autre programme (Delphi 5), j'utilise cette fonction sans utiliser OemToChar (tampon, tampon)

Autres conseils

Delphi 5 ne dispose support unicode, mais seulement par WideStrings qui sont UTF-16 (-LE) codée. Nativement, D5 ne prend pas en charge UTF-8.

Vous pouvez lire la sortie de votre application de console D2010 dans la façon dont vous le faites déjà, bien que je prendrais la conversion OemVersAnsi. OEMTOANSI a été remplacé (même dans les jours D5) par OEMToChar qui peuvent être utilisés pour convertir les caractères OEM pour Ansi (caractères d'un octet en utilisant différentes pages de code) ou WideString (UTF-16-LE Unicode), mais il ne fera pas une chose à interpréter les octets UTF-8 à venir et pourrait bien gâcher les choses.

Qu'est-ce que vous avez besoin est un ensemble de fonctions qui peuvent prendre toutes les « premières » utf-8 octets que vous avez lu de la conduite et les convertir en (UTF-16-LE encodée) WideStrings que vous pouvez ensuite nourrir à un contrôle qui peut prendre et montrer WideStrings. Sinon, vous pouvez chercher un contrôle qui fait l'interprétation de l'octet « brut » et la conversion elle-même tout, mais je dois admettre que je ne l'ai pas vu tout seul qui laisse supporte encore D5.

Une bibliothèque qui peut convertir de nombreux codages différents et supporte encore D5 est DIUnicode:

Vous avez deux problèmes en utilisant Delphi 5 avec la sortie unicode.

La première est TMemo ne prend pas en charge les caractères Unicode, vous devrez trouver un autre contrôle, tels que ceux dans TMS Component Unicode pack . Cependant, ce pack de composants ne supporte pas Delphi 5.

Le deuxième problème est lié à 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 caractères et de les placer dans le tampon qui est un PCHAR (seul caractère par octet D5) Entrez ensuite coulée à un chaîne qui est un AnsiString en D5.

Bien que je ne l'ai pas utilisé D5 pendant des années, le seul type que je ne peux pas oublier que peut traiter les données unicode dans D5 est WideString.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top