Seite 1 von 1

charset/codepage

Verfasst: Mo, 05. Sep 2016 9:22
von Rudolf
Hallo,
wieder mal ein codepage Problem, bekomme in einem XML die Sonderzeichen nicht richtig decodiert. Ich verwende XB2NET, hier kann ich mit xbCPConvert() von einer Codepage in eine beliebig andere umwandeln. Im Header steht <?xml version="1.0" encoding="UTF-8"?>, also müsste die Basis UTF sein

Code: Alles auswählen

DC_LangSet(101)
SET CHARSET TO ANSI
aadd(aChar,{"Ö","Ö"})
aadd(aChar,{"ä","ä"})
aadd(aChar,{"ö","ö"})
aadd(aChar,{"ü","ü"})
aadd(aChar,{"ß","ß"})
for x := 1 to len(aChar)
     //28592     iso-8859-2     ISO 8859-2 Central European; Central European (ISO)
     //1250      windows-1250   ANSI Central European; Central European (Windows)
     //65001     UTF-8

     cOut += aChar[x,1] + "|" + aChar[x,2] + "|" + xbCPConvert(aChar[x,2],65001, 1250 )+ CRLF // in ANSI
     cOut += aChar[x,1] + "|" + aChar[x,2] + "|" + xbCPConvert(aChar[x,2],65001, 28592  )+ CRLF //
     cOut += aChar[x,1] + "|" + aChar[x,2] + "|" + xbCPConvert(aChar[x,2],1250 ,65001 )+ CRLF //
     cOut += aChar[x,1] + "|" + aChar[x,2] + "|" + xbCPConvert(aChar[x,2],28592,65001   )+ CRLF //

next x
memowrit("uml.txt",cOut)
dc_guimemoedit(cout)

Ergebnis:
Ö|Ö|
Ö|Ö|
Ö|Ö|Ă–
Ö|Ö|Ö
---------------
ä|ä|
ä|ä|
ä|ä|ä
ä|ä|ä
---------------
ö|ö|
ö|ö|
ö|ö|ö
ö|ö|Ä‚Å›
---------------
ü|ü|
ü|ü|
ü|ü|ĂĽ
ü|ü|Ăź
---------------
ß|ß|
ß|ß|
ß|ß|Ăź
ß|ß|ß
---------------

Wie komme ich zur richtigen Konvertierung ?
Grüße
Rudolf

Re: charset/codepage

Verfasst: Mo, 05. Sep 2016 9:32
von brandelh
Ich würde das mit meiner Funktion einlesen (memoread() könnte schon konvertieren) und mit Pablos Funktionen nach Ansi umsetzen.
Und zwar die ganze Datei auf einen Schlag !
UTF-8 ist ja zeichenabhängig 1:1, 2:1, 3:1 bis 4:1

file2str() aus Tools oder hier :arrow: http://www.xbaseforum.de/viewtopic.php? ... t=file2str

UTF8 :arrow: http://www.xbaseforum.de/viewtopic.php? ... f8#p103055

Re: charset/codepage

Verfasst: Mo, 05. Sep 2016 11:33
von Wolfgang Ciriack
Ich setze alles um mit

Code: Alles auswählen

ConvToOemCp(cUtf8toAnsi(cxml))
wobei cUtf8toAnsi() aus ot4xb ist.

Re: charset/codepage

Verfasst: Mo, 05. Sep 2016 11:42
von brandelh
das kommt natürlich drauf an ob die EXE in Ansi oder OEM läuft. Ich meine aber Pablo hätte eine eigene OEM Funktion ...

Re: charset/codepage

Verfasst: Mo, 05. Sep 2016 12:14
von Rudolf
Hallo,
ich hoffe doch dass alle das gleiche (richtige) Ergebnis liefern ;-)
Grüße
Rudolf

Re: charset/codepage

Verfasst: Mo, 05. Sep 2016 13:08
von brandelh
Pablo hat 4 Funktionen in der OT4XB,

2 erzeugen Ansi oder Oem Strings aus Utf8:

cUtf8ToAnsi(cUtf8) -> cAnsi
cUtf8ToOem(cUtf8) -> cOem


die anderen erzeugen aus Oem oder Ansi Strings Utf8 Strings:
cAnsiToUtf8( cAnsi ) -> cUtf8
cOemToUtf8(cOem) -> cutf8


man muss nur die richtige Funktion und Richtung wählen, dazu kann man abfragen wie die EXE eingestellt ist, im obigen Quellcode war ja aber von ANSI die Rede.

Wichtig ist, dass der UTF8 String nicht mehr automatisch oder manuell geändert wird.
Ich bin mir nicht sicher, dass dort nur eindeutige Zeichen verwendet werden.