[delphi] Ansi -> Unicode met gegeven charset

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Ik heb een functie waarin een mailtje geparst moet worden (de source van een mailtje). De headers zijn geen enkel probleem, maar bij de body stuit ik op een klein dingetje...

In een van de headers kun je nml opgeven welke charset gebruikt moet worden. Meestal zal dit een normale ansi charset zijn, dus ik wilde graag met die gegeven charset de body van het mailtje converteren naar unicode. Juist unicode omdat het waarschijnlijk is dat de tekens die in de body van het mailtje bedoeld worden, niet in de charset passen die in de locale van de gebruiker gedefinieerd is.

Kortom, ik wil de body van een mailtje *goed* inlezen, en dus niet 1:1 in een AnsiString kwakken :)

Ik weet wel hoe je dit kan doen als de charset utf-8 is (UTF8Decode), maar vanaf andere charsets converteren... :?

日本!🎌


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

WideCharToMultiByte.
MultiByteToWideChar.

Professionele website nodig?


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
MultiByteToWideChar
UINT CodePage


OK, wat moet ik daar dan opgeven? Er staan maar drie opties die in alle windows versies werken, en er zijn véél meer charsets. Vergeet niet dat het enige dat ik te weten kom is de naam van een charset zoals "iso-8859-2" of "shift-jis".

[ Voor 32% gewijzigd door _Thanatos_ op 11-05-2004 00:24 ]

日本!🎌


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Toch ff een klein schopje, want die twee API functies heb ik dus vrij weinig aan...

日本!🎌


  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
Misschien heb je wat aan IMultiLanguage ?

http://msdn.microsoft.com...ang/overview/overview.asp

Is wel een COM object maar er zitten erg handige functies in (oa codepage detection).

http://msdn.microsoft.com...nguage/imultilanguage.asp

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Ok, hoe ik het dus gedaan heb:

Stap 1)
Ga naar de visual studio command prompt en doe een "midl.exe mlang.idl". Dit geeft je een mlang.tlb. Deze importeer je dan in Delphi, die er op zijn beurt een MultiLanguage_TLB.pas van maakt, met alle declaraties van dien.

Stap 2)
Delphi doet het niet goed, en maakt CLASS_nnn constanten ipv CLSID_nnn constanten. Die zou je dus kunnen vervangen. Verder maakt ie van "pointer naar WCHAR" en "pointer naar CHAR" argumenten respectievelijk "var x: ShortInt" en "var x: Word". Dat is niet zo slim, dus die moet je vervangen met respectievelijk PWideChar en PAnsiChar.

Stap 3)
Een functie geschreven om tekst geschreven in een bepaalde charset om te zetten naar unicode:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function ConvertCharset(const S, Charset: string): WideString;
var
   CharsetInfo: tagMIMECSETINFO;
   Mode, SrcSize, DestSize: Cardinal;
begin
if Charset = 'utf-8'
then Result := UTF8Decode(S)
else if Length(Charset) > 0
     then begin
          if MultiLanguage = nil
          then CoCreateInstance(CLASS_CMultiLanguage, nil,
                  CLSCTX_INPROC_SERVER, IID_IMultiLanguage,
                  MultiLanguage);
          if MultiLanguage <> nil
          then begin
               Mode := 0;
               SrcSize := Length(S);
               DestSize := Length(S);
               SetLength(Result, Length(S));
               MultiLanguage.GetCharsetInfo(Charset, CharsetInfo);
               if MultiLanguage.ConvertStringToUnicode(Mode,
                     CharsetInfo.uiCodePage,
                     PChar(S), SrcSize, PWideChar(Result),
                     DestSize) <> S_OK
               then Result := S;
               end;
          end
     else Result := S;
end;

[ Voor 4% gewijzigd door _Thanatos_ op 15-05-2004 22:33 ]

日本!🎌

Pagina: 1