none
Læsning af filer i UNICODE

    Spørgsmål

  • Jeg bliver jævnligt præsenteret for filer med data i UNICODE, der dkal indlæses i C5.
    Pt. løser jeg problemet ved enten at bede dataleverandøren sende mig data som ASCII- eller ANSI-tekstfil, eller også konverterer jeg UNICODE-filen til ANSI eller ASCII i en tekst-editor, der kan konvertere mellem forskellige encodings.
    Er der nogen på dette forum, der har erfaring med at læse UNICODE-filer direkte i C5?
    23. februar 2011 07:45

Alle besvarelser

  • Hej Ebbe,

    Da XML filer typisk skrives som UNICODE / UTF8, kan du finde ud af hvad du skal ved at kigge i Krak integrationen.
    Macroload Services macro biblioteket:
    #MacroLoad(Services)
    Og alt efter version har du en macro til rådighed der hedder #TekstKonv eller #TxtConv
    Den bruges således:
    STR 100 &DinUNICODEstr = "unicode str og hej"
    #TxtConv(&DinUNICODEstr)

    //Nu er &DinUNICODEstr i ASCII format

    Mvh
    Mads W.

    23. februar 2011 08:13
  • Hej Mads

    Mit problem opstår allerede, når jeg indlæser filen.
    Åbner jeg filen i Notepad ser det ud som det skal, men læser jeg filen ind i C5 med
    READ &Filename AS TEXT INTO (&String)
    ser det ud som noget der er tegnet for sjov.

    Hex-dumper jeg filen starter den med FF FE og hvert tegn derefter fylder 2 bytes, typisk startende med 00 efterfulgt med ANSI-værdien af et tegn.

    f.eks.

    En .csv-fil i UTF-8 ser sådan ud i Notepad:
    1;DANMARK A
    2;DANMARK B

    Hex-dump:
    FF FE 31 00 3B 00 44 00 41 00 4E 00 4D 00 41 00
    52 00 4B 00 20 00 41 00 0D 00 0A 00 32 00 3B 00
    44 00 41 00 4E 00 4D 00 41 00 52 00 4B 00 20 00
    42 00 0D 00 0A 00

    Det er det problem, jeg kæmper med.

     

    23. februar 2011 10:05
  • Jeg kan se af de øvrige svar at det er oioxml-filer, du vil læse ind.

    Du skal have konverteret alle specialtegnene, og så er det lige til at gå til - indlæs hver linie for sig, og træk data ud. Enhver forhandler med en håndsværksløsning har lavet det, så måske du kan få lov til at købe koden et sted, hvis du synes det er for bøvlet.

    Mvh Maria

    23. februar 2011 11:51
  • Hej igen,

    Hvis du gør således, virker det så ikke?

    READ &Filename AS TEXT INTO (&String)
    #TxtConv(&String)

    //Nu skulle &String gerne være Ascii...

    23. februar 2011 12:08
  • Hej Maria

    I dette tilfælde er det en .csv-fil, der er encoded i UTF-8 (en form for UNICODE), men jeg har også haft udfordringer med XML-filer tidligere. Indtil nu er det lykkedes mig at få leverandørene til at encode filerne som almindelig ANSI-filer, som C5 ikke har problemer med.

    UPS - Jeg så lige at der var en forstyrrende fejl i Hex-dumpet i mit tidligere indlæg. Det er nu rettet :-)

    23. februar 2011 12:16
  • Hej Mads

    Se lige dette eksempel:

    //---------------------------------------------
    #MacroLoad(SERVICES)

    STR 999 &String1
    STR 999 &String2
    STR 100 &Filename

    SET &Filename = #GetFile("UTF8 file",'*.csv')

    SET &InRecDel = '\n'
    SET &InFldDel = '@'+'@'+'@'
    READ &Filename AS TEXT INTO (&String1)
        SET &String2 = &String1
        #TxtConv(&String2)

        PRINT &String1
        PRINT &String2
        PRINT '---------------------------'
    END
    PAUSE
    //---------------------------------------------

    .csv-filen der er som nedenfor og er UTF-8-encoded.
    1;DANMARK A æøåÆØÅ
    2;DANMARK B

    Når scriptet køres, printes følgende:
    ■1 ; D A N M A R K   A   µ ° Õ ã Ï ┼
    ■1 ; D A N M A R K   A   µ ° Õ ã Ï ┼
    --------------------------
    2 ; D A N M A R K   B 
    2 ; D A N M A R K   B 
    ---------------------------

    #TxtConv() laver f.eks. "&" om til "&" og ">" om til ">", sådan som jeg læser koden.

     

    23. februar 2011 14:37
  • Hej,

    Læsning og skrivning i UTF-8 burde være noget kernen håndterede, men sådan er det desværre ikke..

    Der findes en global FNC=XALFUTF8Convert - Her kan du se hvad der rent faktisk sker ved konvertering til UTF-8 og så lave en funktion der kører den anden vej - Det ser ud som om du godt kan finde ud af at programmere..

     

    23. februar 2011 18:33
  • Hej Aidal

    Jeg er XAL/C5 udvikler - bestiller ikke andet end at kode ;-)

    Men hvorfor opfinde den dybe tallerken, hvis den allerede ligger klar til brug i et eller andet programelement i C5, som jeg ikke er bekendt med.

    Tak for tippet. Den funktion havde jeg lige overset.
    .
    .
    .
    Jeg har nu kigget nøjere på FNC=XMLFUTF8Convert.
    Den konverterer den "gale" vej. Der konverteres fra ANSI (ISO-8859-1) til XML/UTF8.

    Jeg må nok se i øjnene, at der skal fyres op under kode-generatoren.

    Tak for jeres interesse.
    Jeg lærte #TxtConv(&String) at kende og FNC=XMLFUTF8Convert.

    24. februar 2011 08:08
  • Hej Ebbe,

    Jeg er faldet over et systemet hvor jeg har lavet en FNC der går den anden vej - Hvis du skriver din mailadresse, kan jeg sende den til dig!

     

    25. februar 2011 13:09
  • Hej Aidal

    Du kan sende det til greenmanhunter@gmail.com.

    Jeg har i mellemtiden fået skrevet en simpel løsning:

    #MACROLIB.FILE

    #File   &IndFil
    INT &Byte1
    INT &Byte2
    INT &Word
    STR 1000 &String

    SET &IndFil = #Open('TestUTF8.txt','RB')
    IF &Indfil THEN
        SET &String = ''
        WHILE NOT #Eof(&IndFil)
            SET &Byte1 = #Read(&Indfil)
            SET &Byte2 = #Read(&Indfil)
            SET &Word = &Byte2 << 8 + &Byte1
            IF &Word < 0x20 THEN
                IF &Word == 0x0A THEN
                    PRINT StrLen(&String), ' ', &String
                    SET &String = ''
                ENDIF
            ELSEIF &Word <= 0xFF THEN
                #ADD(&String,Num2Char(&Word))
            ENDIF
        END
        #Close(&IndFil)
    ELSE
        SET BOX(2,"Kunne ikke åbne filen",0)
        RETURN 0
    ENDIF

    PRINT StrLen(&String), ' ', &String
    PAUSE

    25. februar 2011 13:38
  • Hej Aidal2,

    Jeg har samme problem som Ebbe, bortset fra at min indlæsning foregår
    via com handle i C5 og kan derfor ikke benytte Ebbe's lille kode snippet.

    Men kunne måske godt benytte din FNC, hvis det var muligt at få en kopi af denne ??

     

    Med venlig hilsen og tak
    Jan Nielsen (C5 Partner)

    Mail : amcjn@hotmail.com

     

    18. november 2011 08:16
  • Hej Aidal2

    Jeg har ikke anvendt det kode, jeg fik.

    Som jeg husker der var årsagen, at det kode jeg fik viste sig at konvertere til UNICODE og ikke fra UNICODE.

    Ebbe

    18. november 2011 08:57