amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Konvertieren: iso-8859-1 [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

18.06.2007, 21:11 Uhr

Ralf27
Posts: 2779
Nutzer
Gibt es eigentlich eine Möglichkeit sowas über das System zu konvertieren? Oder muß man es doch selbst über Tabellen lösen? Also Konvertieren zum "normalen" ansehn.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

18.06.2007, 21:57 Uhr

_PAB_
Posts: 3016
Nutzer
Mit iconv läßt sich das lösen, entweder nativ auf Linux o.ä. oder zB. über PHP:
http://www.gnu.org/software/libiconv/
http://www.php.net/iconv

[ - Antworten - Zitieren - Direktlink - ]

18.06.2007, 22:10 Uhr

Ralf27
Posts: 2779
Nutzer
Ich wollte das eigentlich in einem Programm lösen, denn dieses Problem hab ich gerade in meinem Programm.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

19.06.2007, 01:33 Uhr

cgutjahr
Posts: 2783
[Administrator]
Zitat:
Original von Ralf27:
Gibt es eigentlich eine Möglichkeit sowas über das System zu konvertieren?

Nein.

Zitat:
Oder muß man es doch selbst über Tabellen lösen? Also Konvertieren zum "normalen" ansehn.
Ein etwas genauere Problembeschreibung wäre hilfreich ;)

Die codesets.library konvertiert zwischen diversen Code-Tabellen (ISO-8859-#?, AmigaPL, Amiga-1251, KOI8-R, UTF-8):

http://aminet.net/package/util/libs/codesets
--
Gutjahrs Amiga Seiten

[ - Antworten - Zitieren - Direktlink - ]

19.06.2007, 12:39 Uhr

Holger
Posts: 8116
Nutzer
Die AOS4 diskfont.library bietet die Möglichkeit via ObtainCharsetInfo Konvertierungstabellen für 8Bit-single-byte Charsets abzufragen. Allerdings erscheint mir die codesets.library da auch die besser Wahl zu sein. Läuft auf AOS3.x, AOS4, MOS gleichermaßen und unterstützt halt auch die anderen Charsets.

mfg

--

[ Dieser Beitrag wurde von Holger am 19.06.2007 um 12:40 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

19.06.2007, 21:08 Uhr

Ralf27
Posts: 2779
Nutzer
Also die Codeset.lib sieht recht gut aus. Ich hab mir mal die Beschreibung durchgelesen(nunja, nur die entsprechenden Befehle die ich brauchen werden und das sind genau zwei :D ) und somit sieht die Sache für mich recht einfach aus.

Aber dennoch, wie immer, gibt es da für mich ein kleines Problem:
Ich schreib ja leider als noch in MaxonBasic und muß also erst mal ein paar Dateien konvertieren. Eine bmap-Datei konnte ich bereits aus der .fd-Datei konvertieren. Eine .bd-Datei ist auch kein großes Problem, allerdings macht mir die .bc-Datei mit den Konstanten doch große Probleme. Ich hab die entsprechende Stelle mit den Konstanten bei der codeset.lib gefunden (include/library/codesets.h), allerdings komme ich da nicht so ganz klar was da die eigentlich Werte dastellen sollen ;( :
Z.b.
code:
#define CODESETSLIB_TAG(n)     ((ULONG)0xfec901f4+(n))

#define CSA_Base                CODESETSLIB_TAG(0)

#define CSA_SourceLen           CODESETSLIB_TAG(1)
#define CSA_Source              CODESETSLIB_TAG(2)
#define CSA_Dest                CODESETSLIB_TAG(3)
#define CSA_DestLen             CODESETSLIB_TAG(4)
#define CSA_DestHook            CODESETSLIB_TAG(5)
#define CSA_DestLenPtr          CODESETSLIB_TAG(6)
#define CSA_SourceCodeset       CODESETSLIB_TAG(7)
#define CSA_Pool                CODESETSLIB_TAG(8)
#define CSA_PoolSem             CODESETSLIB_TAG(9)
#define CSA_AllocIfNeeded       CODESETSLIB_TAG(10)
#define CSA_Save                CODESETSLIB_TAG(11)
#define CSA_FallbackToDefault   CODESETSLIB_TAG(12)
#define CSA_DestCodeset         CODESETSLIB_TAG(13)
#define CSA_CodesetDir          CODESETSLIB_TAG(14)
#define CSA_CodesetFile         CODESETSLIB_TAG(15)
#define CSA_CodesetList         CODESETSLIB_TAG(16)
#define CSA_FreeCodesets        CODESETSLIB_TAG(17)
#define CSA_CodesetFamily       CODESETSLIB_TAG(18)
#define CSA_ErrPtr              CODESETSLIB_TAG(19)

#define CSA_B64SourceString     CODESETSLIB_TAG(20)
#define CSA_B64SourceLen        CODESETSLIB_TAG(21)
#define CSA_B64SourceFile       CODESETSLIB_TAG(22)
#define CSA_B64DestPtr          CODESETSLIB_TAG(23)
#define CSA_B64DestFile         CODESETSLIB_TAG(24)
#define CSA_B64MaxLineLen       CODESETSLIB_TAG(25)
#define CSA_B64Unix             CODESETSLIB_TAG(26)
#define CSA_B64FLG_NtCheckErr   CODESETSLIB_TAG(27)


Ich nehm mal an das ganz oben eine Funktion steht und das ich dann einfach die Zahlen in denn Klammeren zu der Zahl in der Funktion addieren muß und damit hab ich dann denn eigentlich Wert der Konstanten.
Frage: Wieso macht man das denn so kompliziert?
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

19.06.2007, 22:14 Uhr

Ralf27
Posts: 2779
Nutzer
Hab mal eben alles(vermutlich richtig) nach bmap, bh und bc konvertiert. Aber leider scheint jetzt mein Compiler (MBasic) die Befehle nicht zu mögen, bzw. deren Anzahl der Parameter. z.b. geht folgendes nicht:

code:
srcCodeset&=CodesetsFindA&(SADD("ISO-8859-1"+CHR$(0)),NULL&)
dstCodeset&=CodesetsFindA&(SADD("Amiga-1251"+CHR$(0)),NULL&)


Er meint, es wären die falsche Anzahl an Parametern, aber irgendwie sollte das doch so stimmen, wenn ich die Doku verstanden habe.

Die Lib ist auch mit declare function CodeSetsFindA& library gekennzeichnet.

Ne Idee? Achja, wenn ich Spaßhalber einen parameter dazu gebe (z.b. 0), dann läuft der Compiler weiter... ja, mir ist schon klar... murkscompiler... jo. :D
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

20.06.2007, 09:45 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Frage: Wieso macht man das denn so kompliziert?


Jeder Programmierer nimmt nach und nach die Denkweise der Programmiersprache an, mit der er ständig arbeitet. Wenn diese also total verdreht und unnötig kompliziert ist, wird er mit der Zeit auch immer verdrehteren und unnötig verkomplizierten Code schreiben. Außerdem ist #define CSA_B64Unix CODESETSLIB_TAG(26) immerhin ein Zeichen kürzer als #define CSA_B64Unix (CODESETSLIB_TAG+26), also die sonst übliche Variante.

Was die Anzahl der Parameter angeht: die nimmt MBasic aus der .bmap Datei, die Du aus der .fd Datei generiert hast. Wenn die nicht stimmt, ist die .bmap Datei fehlerhaft, entweder weil die .fd Datei schon falsche Informationen enthält (was ich hier aber nicht sehe), oder weil das Konvertieren schief gegangen ist. Dass MBasic bei der Allerweltskonstellation "zwei Parameter, zwei Adressregister" einen Fehler haben soll, kann ich mir eigentlich nicht vorstellen.

Andererseits...wir reden über MBasic...

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

20.06.2007, 10:41 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von Ralf27:
Frage: Wieso macht man das denn so kompliziert?


Jeder Programmierer nimmt nach und nach die Denkweise der Programmiersprache an, mit der er ständig arbeitet. Wenn diese also total verdreht und unnötig kompliziert ist, wird er mit der Zeit auch immer verdrehteren und unnötig verkomplizierten Code schreiben.


Ich denke, hier liegt das Problem eher bei der Makro-Wut von Unix-Codern und weniger bei der Programmiersprache an sich. Wer Teile eines oftmals in C entwickelten Programms mit (meist auch noch mehreren unterschiedlichen) Makro-Prozessoren erstellen läßt, kennts halt nicht anders und macht das dann überall so, auch da, wo es nicht angebracht ist. Willkommen in der schönen Welt der Ports und des Formalismus.

@Ralf: Schau Dir mal z.B. die Definition von Window-Tags an und vergleiche das mal mit der, die Du hier nicht so ganz verstanden hast. Im Groben ist das hier der gleiche "Mechanismus", nur aus Schreibfaulheit etwas verkürzt und mit Makro-Parametern "gewürzt".

Das ist also keine Funktion im herkömmlichen Sinn da ganz am Anfang sondern ein Präprozessor-Makro mit Parameter, aus dem dann die weiteren Tag-Definitionen entstehen.

Setz einfach in Gedanken bei jedem Tag statt "CODESETSLIB_TAG" "((ULONG)0xfec901f4+(n))" ein und bau in die "Rechnung" den Parameter aus der Klammer hinter CODESETSLIB_TAG ein und Du solltest verstehen, was da passiert.

Nichts anderes macht der Präprozessor des C-Compilers auch, und zwar bei jedem Auftreten von CODESETSLIB_TAG im Quelltext, egal wo (!). Da ersetzt er dann z.B. den Text CODESETSLIB_TAG(1) mit dem Text ((ULONG)0xfec901f4 + (1)), also simplem C-Code.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

20.06.2007, 20:08 Uhr

Ralf27
Posts: 2779
Nutzer
Das mit den Konstanten wurde mir erst klar, als ich wärend des Eintrag schreiben war. Ich denke mal, das ich das richtig konvertiert habe.

Die Sache mit der bmap macht mir da jetzt mehr Kopfzerbrechen. Denn in der bmap scheint wohl der Hase im Pfeffer zu liegen. Die scheint wohl fehlerhaft zu sein. Muß ich mir später mal ansehn.

Wäre schön wenn ich diese Lib in MaxonBasic aus auch nutzen könnte und eigentlich müßte es doch auch laufen. Eigentlich...
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

23.06.2007, 21:48 Uhr

Ralf27
Posts: 2779
Nutzer
Hab mir eben nochmal das Problem angesehn, komme aber leider nicht weiter. Ich vermute auch das die bmap-Datei fehlerhaft ist, aber ich hab sie so gewandelt wie immer (mit einem Tool das bei MaxonBasic dabei war), aber ich kann sonst keine andere Fehlerquelle finde.

Ich war eben kurz auf der Suche im Aminet, da gibt es ja auch ein Tool dafür. Aber leider weis ich nicht mehr nach was man da genau suchen muß. Die Suche nach bmap bringt nix bzw. fd wohl nicht das richtige (C oder ASM ...)

Mit welchem Tool kann ich noch .fd nach .bmap konvertieren? Ich hoffe das es wirklich daran liegt. Ich würde schon gerne diese Lib mitnutzen können...
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

23.06.2007, 22:46 Uhr

NoImag
Posts: 1050
Nutzer
@Ralf27:

Bei AmigaBASIC ist ein BASIC-Programm mit dem Namen "ConvertFD" dabei, das bmap-Dateien erstellt. Aber wahrscheinlich ist es dasselbe Programm, was auch bei MaxonBASIC dabei ist.

Tschüß


[ - Antworten - Zitieren - Direktlink - ]

24.06.2007, 07:54 Uhr

Holger
Posts: 8116
Nutzer
fd2pragma dürfte wohl zu dem Thema das Programm mit der aktivsten Pflege sein.
Siehe http://aminet.net/package/dev/misc/fd2pragma
Im Readme steht auch Support für BMAP drin. Habe ich selber aber nie getestet.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

24.06.2007, 10:23 Uhr

Ralf27
Posts: 2779
Nutzer
Zja, die bmap war wirklich falsch erstellt. Das Programm bei MBasic ist wohl nicht ganz ausgereift.

Ok, jetzt stimmen die Anzahl der Parameter und der Compiler läuft durch.
Aber:

code:
srcCodeset&=CodesetsFindA&(SADD("ISO-8859-1"+CHR$(0)),NULL&)
 dstCodeset&=CodesetsFindA&(SADD("Amiga-1251"+CHR$(0)),NULL&)


bei scrCodeSet& bekomme ich eine glatte NULL geliefert, dstCodeSet& scheint zu funktionieren. Was könnte denn das nun schon wieder sein?
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

24.06.2007, 11:14 Uhr

Ralf27
Posts: 2779
Nutzer
Hab eben denn Fehler gefunden. War ein peinlicher Fehler meinerseits: Variable falsch geschrieben... scr.. src...

Mir ist klar das andere Compiler das wohl bemerkt hätten...

Aber, jetzt läufts! *freu* :D :bounce: :itchy:
--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 24.06.2007 um 11:15 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

24.06.2007, 13:23 Uhr

Ralf27
Posts: 2779
Nutzer
Ähm, zu früh gefreut:

Der Compilter läuft durch ohne Fehler, ok.
Das Programm läuft durch, auch ohne Fehler, ok.

Aber der Text ist nach dem konvertieren noch der gleich?

Ich hatte vor Text von ISO-8859-1 nach Amiga-1251 zu konvertieren. Aber nicht nur eine Zeile, sondern gleich ein paar kb mit CodeSetsConvertStrA():

code:
... ohne Anfang mit Libs, etc.
 
 scrCodeset&=CodesetsFindA&(SADD("ISO-8859-1"+CHR$(0)),NULL&)
 dstCodeset&=CodesetsFindA&(SADD("Amiga-1251"+CHR$(0)),NULL&)
 
 IF scrCodeset&=0 OR dstCodeset&=0 THEN
  PRINT"Problem beim Codeset"
 ELSE
  TAGLIST tagsl&,_
  CSA_SourceCodeset&, scrCodeset&,_
  CSA_DestCodeset&,   dstCodeset&,_
  CSA_Source&,        SADD(text$),_
  CSA_Len&,           LEN(text$),_
  TAG_DONE& 
  dst&=CodesetsConvertStrA&(tagsl&)
  IF dst& THEN PRINT PEEK$(dst&) ELSE PRINT "Fehler!!"
 END IF
 PRINT "Programm Ende"
Ende:
 IF dst& THEN CodesetsFreeA dst&, NULL&

--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

24.06.2007, 15:20 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Aber der Text ist nach dem konvertieren noch der gleich?

Ich hatte vor Text von ISO-8859-1 nach Amiga-1251 zu konvertieren.


*kopfkratz*
Was für ein Encoding soll dieses "Amiga-1251" denn sein? Das Encoding des Amigas war seit Urzeiten auf "ISO-LATIN-1" aka "ISO-8859-1" festgelegt. Mit AOS3.9 hat H&P das "ISO-LATIN-9" aka "ISO-8859-15" als "Standard" gesetzt und mit AOS4 finden diverse Zeichenkodierungen Einzug, aber von "Amiga-1251" hab ich bislang nichts gehört. Es gibt ein "Windows-1252" auch als CP1252 bekannt, das ziemlich verbreitet ist, allerdings sind die Unterschiede zwischen Latin 1, Latin 9 und CP1252 ziemlich gering. Sie betreffen nur diese Zeichen.

Wenn die Konvertierung nichts sichtbares bewirkt, dann vielleicht, weil keine betroffenen Zeichen im Text enthalten sind?

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.
Edit:Link auf Wikipedia gesetzt, weil das Forum neuerdings noch schlechter mit Sonderzeichen umgeht.


[ Dieser Beitrag wurde von Holger am 24.06.2007 um 15:26 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

24.06.2007, 16:36 Uhr

thomas
Posts: 7718
Nutzer
Zitat:
von "Amiga-1251" hab ich bislang nichts gehört

Google ist dein Freund

Zitat:
Aber der Text ist nach dem konvertieren noch der gleich?

Ich hatte vor Text von ISO-8859-1 nach Amiga-1251 zu konvertieren.


Was willst du denn da konvertieren ? Hast du dir die beiden Tabellen mal angesehen ? Die ersten 192 Zeichen sind identisch und die restlichen 64 sind disjunkt (die Zeichen der einen Tabelle sind in der anderen nicht enthalten und umgekehrt), da kann man nichts konvertieren.

Ein Zeichen kann nur von einem Codeset in ein anderes konvertiert werden, wenn es in beiden Tabellen enthalten ist. Wenn es aber in der Zieltabelle gar nicht vorkommt, in was soll es denn dann konvertiert werden ?

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

24.06.2007, 19:29 Uhr

Ralf27
Posts: 2779
Nutzer
Hm, ich bin jetzt gelindegesagt etwas baff, denn ich hab mir die Tabellen gar nicht angesehn. Ich hab nur gesehn das der Text mit Steuerzeichen angezeigt wird und im Header ENNCODING=ISO-8859-1 steht.
Mit Steuerzeichen meine ich z.b.
code:
& # 252 ;

oder
code:
& # 223 ;

(hab eben gesehn das auch diese Zeichen übersetz werden, hab deswegen jetzt Leerzeichen eingefügt)

In einem Beispiel der codesets.library finde ich z.b. auch folgendes:
code:
EXAMPLE
    To convert an ISO-8859-1 encoded string 'src' into an Amiga-1251
    equivalent 'dst' string:
    -- cut here --
    STRPTR src, dst;
    struct codeset *srcCodeset, *dstCodeset;

    srcCodeset = CodesetsFindA("ISO-8859-1", NULL);
    dstCodeset = CodesetsFindA("Amiga-1251", NULL);

    if((dst = CodesetsConvertStr(CSA_SourceCodeset, srcCodeset,
                                 CSA_DestCodeset,   dstCodeset,
                                 CSA_Source,        src,
                                 TAG_DONE)))
    {
      ....

      CodesetsFreeA(dst, NULL);
    }
    -- cut here --


Aber wenn der Code nicht die Steuerzeichen konvertiert, dann muß ich das Problem wohl doch anderst angehn. Bzw. mit der Hand konvertieren?!?
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

25.06.2007, 23:00 Uhr

Ralf27
Posts: 2779
Nutzer
Ich konvertiere das jetzt mit der Hand. Mir ist aufgefallen das die Werte ASCII-Werte sind, die man einfach durch den ASCII-Buchstaben ersetzen muß. War eine relativ einfache Routine. Hoffe aber auch, da sich damit auch nicht wieder ein Bockmist gebaut habe.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

26.06.2007, 10:16 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Mit Steuerzeichen meine ich z.b.
code:
& # 252 ;

oder
code:
& # 223 ;


Aua.
Wo sind denn da Steuerzeichen? Ich seh da nur normale, druckbare Zeichen. So wie sie da stehen, stellen sie Character Entities dar, sofern sie in einer Html oder XML Datei stehe, das hat aber wirklich überhaupt nichts mit Character Encodings oder Steuerzeichen zu tun. Die Zahl zwischen Raute und Semikolon ist als Unicode-Codepoint zu interpretieren, wenn man Html oder Xml Dateien verarbeitet.
Siehe http://de.selfhtml.org/html/referenz/zeichen.htm

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

26.06.2007, 20:47 Uhr

Ralf27
Posts: 2779
Nutzer
@Holger:

Danke, das wußte ich nicht. Soweit bin ich in Sachen HTML nie eingestiegen. Dachte halt, das wäre beim Encoding inbegriffen.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Konvertieren: iso-8859-1 [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.