2010-09-04 14 views
2

Nous avons écrit un programme Delphi qui envoie des informations avec CDO.Delphi: problèmes d'encodage CDO.Message

Dans ma machine Win7 (hongrois) les accents fonctionnent bien. Donc, si j'ai envoyé un mail avec "ÁÉÍÓÖŐÚÜŰ", je l'ai eu dans ce format. J'ai utilisé le codage iso-8859-2 dans le corps, ce qui code le sujet et les adresses électroniques (l'adresse de l'expéditeur contient le nom).

Je pensais avoir fini avec ça.

Mais lorsque je tente d'envoyer un mail d'une machine anglaise Win2k3 (le serveur de diffusion est le même!), Le résultat est tronquer quelques accents: U = U O = O

Ensuite, j'essayé d'utiliser Encodage UTF-8 ici.

Cela fourni des accents - mais de faux accents.

Le courrier contient des accents avec des signes ^.

ê <> é

Ce n'est pas lettre valide ... :-(hongrois

Je veux savoir, comment je convertir ou configurer l'entrée que je suis bon résultat.

J'ai essayé de connecter le corps pour voir est des changements ...

Log(SBody); 
Msg.Body := SBody; 
Log(Msg.Body); 

... ou non.

Mais ces journaux fournissent un bon résultat, l'entrée est bonne.

Il est donc possible de perdre et de mal interpréter le message généré par CDO. Puis-je aider le CDO si je peux encoder le texte ANSI en UTF réel. Mais dans Delphi, les fonctions du convertisseur n'ont pas de paramètres "CodePage". En Python je peux dit:

s.encode('iso-8859-2') 

ou

s.decode('iso-8859-2') 

Mais à Delphes, je ne vois pas ce paramètre.

Quelqu'un sait-il, comment préserver les accents, comment convertir les cordes accentuées hongroises pour leur préserver le format accentué?

Et je veux savoir, puis-je vérifier le résultat sans envoyer le courrier?

Merci pour votre aide: dd

+0

S'il vous plaît nous dire la version Delphi vous travaillez. Les fonctionnements sont différents de la version 2009 vers le haut, car ils ont introduit UNICODE. –

+0

En plus de la version Delphi, il serait également utile de savoir comment accéder à la fonctionnalité CDO. Je viens d'importer la bibliothèque de types pour ce composant et je ne trouve aucune fonction nommée encoder ou décoder, seulement GetEncodedContentStream/GetDecodedContentStream. Si python offre ces fonctions de codage/décodage, il se peut que python augmente l'implémentation CDO réelle en ajoutant des méthodes supplémentaires. –

+0

Salut! Delphi 6 Professionnel. – durumdara

Répondre

0

une recherche rapide Google avec « codepage chaîne delphi » m'a fait torry's delphi pages et peut-être les codesnippets suivants (trouvés here) peut faire la lumière sur votre problème:

{:Converts Unicode string to Ansi string using specified code page. 
    @param ws  Unicode string. 
    @param codePage Code page to be used in conversion. 
    @returns Converted ansi string. 
} 

function WideStringToString(const ws: WideString; codePage: Word): AnsiString; 
var 
    l: integer; 
begin 
    if ws = ' then 
    Result := ' 
    else 
    begin 
    l := WideCharToMultiByte(codePage, 
     WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR, 
     @ws[1], - 1, nil, 0, nil, nil); 
    SetLength(Result, l - 1); 
    if l > 1 then 
     WideCharToMultiByte(codePage, 
     WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR, 
     @ws[1], - 1, @Result[1], l - 1, nil, nil); 
    end; 
end; { WideStringToString } 


{:Converts Ansi string to Unicode string using specified code page. 
    @param s  Ansi string. 
    @param codePage Code page to be used in conversion. 
    @returns Converted wide string. 
} 
function StringToWideString(const s: AnsiString; codePage: Word): WideString; 
var 
    l: integer; 
begin 
    if s = ' then 
    Result := ' 
    else 
    begin 
    l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), - 1, nil, 0); 
    SetLength(Result, l - 1); 
    if l > 1 then 
     MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]), 
     - 1, PWideChar(@Result[1]), l - 1); 
    end; 
end; { StringToWideString } 

--reinhard

+0

Salut! J'ai utilisé votre code pour convertir la chaîne. Quand je fais cela en Windows hongrois, le CDO envoie des caractères normaux accentués. Quand j'envoie en machine anglaise, l'accent est perdu. Néanmoins, je les convertis en WideString avant de les envoyer, et je mets BodyPart.CharSet à iso-8859-2, ou utf-8 ... :-( – durumdara

+0

Plus j'ai testé les deux machines avec un code simple. WideString, et UTF-s Je les ai générés dans un fichier.J'ai comparé les deux fichiers, et ils sont identiques, peu importe, où j'ai généré.C'est donc un problème CDO semble - mais je ne sais pas, où je recherche de solution ... :-( – durumdara

+0

J'ai testé aujourd'hui avec Python et CDO.Les chaînes de caractères Python sont converties au besoin en courrier.Les accents apparaissent bien.C'est donc la question: ce que nous faisons mal du côté de Delphi à des accents perdus de WideStrings, et ce que Python font pour qu'ils restent? – durumdara