Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi (gelöst) ISO8859 nach UnicodeString (https://www.delphipraxis.net/169284-geloest-iso8859-nach-unicodestring.html)

christophspaeth 9. Jul 2012 16:49


(gelöst) ISO8859 nach UnicodeString
 
Hallo,

ich schlage mich gerade damit rum, unseren Code von Delphi 2006 auf XE2 zu portieren und habe an der einen oder anderen Stelle Probleme mit Unicode bzw. Zeichensätzen.

Momentan habe ich folgendes Problem:
Ich lese eine Datei (MIME-ähnlich Struktur) erstmal in RawByteStrings.
Nun habe ich Stellen, an denen im Text der charset steht (u.a. auch gemäß RFC1522 =?ISO8859-15?Q?hall=F6?=). Ein komplettes Einlesen mit einem angegebenen Encoding scheidet zum einen aus, weil das encoding eben erst in der Datei steht und zum anderen könnten theoretisch mehere Encodings verwendet werden.

Bisher haben wir dafür DIConverters und DIUnicode verwendet, aber wenn es da schon im Delphi was sinnvolles gibt, würde ich gerne auf Bordmittel zurückgreifen. Zwar habe ich die Funktion SetCodePage gefunden, weiß aber nicht, wie ich von den Text 'ISO-8859-15' oder auch 'KOI8' auf den Wert für die Codepage komme oder ob Delphi evtl. nur Windows Codepages unterstützt.

Also die konkrete Frage: Gibt es irgendwo eine Liste mit den unterstützen Codepages bzw. eine Funktion, die mir aus dem Text 'ISO-8859-15' die Codepage für SetCodepage liefert?

Danke für's lesen!
Chris

himitsu 9. Jul 2012 16:58

AW: ISO8859 nach UnicodeString
 
Du kannst beim RawByteString (oder beim AnsiString) über Delphi-Referenz durchsuchenSetCodePage die CodePage ändern.

Also den Teilstring aus deinem großen String rauskopieren, die CodePage ändrn und dann ganz normal weiterbenutzen, wobei Delphi hier nun die gewünschte CodePage verwendet, wenn man diesen String in einen String/UnicodeString kopiert, bzw. an einen Parameter/Property übergibt. (das Convert muß aber auf False gesetzt werden)



Ein AnsiString ist praktisch ein RawByteString mit CP_ACP als CodePage, der Utf8String mit CP_UTF8 und der UnicodeString mit UTF-16.

christophspaeth 9. Jul 2012 17:28

AW: ISO8859 nach UnicodeString
 
Hallo himitsu,

danke für deine Antwort.

Das mit SetCodePage hatte ich schon rausgefunden und das ist auch wie (etwas versteckt, ich gebs zu) geschrieben mein Lösungsansatz. Leider weiß ich nicht, wie ich an den richtigen Parameter Codepage dafür komme und finde in der Hilfe auch nichts.

Ich kann zwar im Fall UFT-8 die Codepage auf CP_UTF8 setzen (oder gleich UTF8ToString() verwenden) und bei Windows oder OEM-Codepages (glaube ich) einfach den numerischen Teil verwenden, aber für ISO-8859-X bin ich etwas ratlos.

Gruß Chris

himitsu 9. Jul 2012 17:41

AW: ISO8859 nach UnicodeString
 
ISO-8859-1 ist die CodePage 28591 (für 1-9)

mjustin 9. Jul 2012 19:58

AW: ISO8859 nach UnicodeString
 
Zitat:

Zitat von christophspaeth (Beitrag 1174116)

Also die konkrete Frage: Gibt es irgendwo eine Liste mit den unterstützen Codepages bzw. eine Funktion, die mir aus dem Text 'ISO-8859-15' die Codepage für SetCodepage liefert?

Die Indy Unit Protocols\IdCharsets enthält Funktionen für das Mapping zwischen Zeichensatznamen zu Codepages.

Delphi-Quellcode:

function FindCharset(const ACharSet: string): TIdCharset;
function CharsetToCodePage(const ACharSet: TIdCharSet): Word; overload;
function CharsetToCodePage(const ACharSet: String): Word; overload;
Gefunden zwischen anderen Tipps hier: How do I get a HTTP charset name from current Windows locale?

christophspaeth 10. Jul 2012 09:00

(gelöst) ISO8859 nach UnicodeString
 
Hallo,

danke für die Antworten. Ich werde die Indy-Funktion CharsetToCodePage für diese Problemstellunge verwenden.


Zitat:

Zitat von himitsu (Beitrag 1174120)
ISO-8859-1 ist die CodePage 28591 (für 1-9)

Kleine Anmerkung falls jemand 8859-15 sucht:
Laut der IdCharsets ist 28605 der Wert für ISO-8859-15 , es geht also anscheinend nach der 9 einfach weiter...

Gruß Chris

himitsu 10. Jul 2012 10:04

AW: (gelöst) ISO8859 nach UnicodeString
 
Das war nur das, was ich im Kopf hatte. Es gibt ja auch noch andere ISOs, außer der 8859 und da sind die Zuordnungen nicht so einfach.

In meinem kleinen himXML (in der himxml.pas) hatte ich auch noch ein paar andere Charsets.

Das mit dem CharsetToCodePage klingt ja nicht so gut, aber ich glaub das bau ich dort nicht direkt ein, da dann nur deswegen das Indy dort mit reinrutscht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz