UTF-8 Bug?

Fragen und Bugreports zur PureBasic 4.0-Beta.
WHEEZ
Beiträge: 33
Registriert: 15.07.2005 11:39

UTF-8 Bug?

Beitrag von WHEEZ »

Hallo,
ich habe ein seltsames Problem mit Utf8. Folgender Code:

Code: Alles auswählen

CreateFile(0, "C:\test.txt") 
WriteStringFormat(0, #PB_UTF8)
WriteString(0,"€" ,#PB_UTF8)
CloseFile(0)
(das Zeichen das geschrieben werden soll ist das >€< - wird nur hier als Code nicht dargestellt)

Der Schnipsel sollte eigentlich das "€" Zeichen in eine Textdatei speichern. Klappt aber nicht - ergibt nur Quatschzeichen. In der Original IDE (PB 4.0.1) wird das Zeichen nicht mal im Quellcode dargestellt (JaPBe geht). Sobald ich mit der Option "Unicode-Exe" kompiliere, geht es. In der Hilfe zu WriteString() steht allerdings dass es egal sei. Mein Problem ist, dass ich das in einem recht umfangreichen Programm brauche, das sich leider nicht so einfach auf Unicode umstellen lässt.

Was anderes noch - ich dachte zwar dass ich die aktuelle 4.0.1 installiert hätte (die IDE zeigts auch an) - aber "Debug #PB_Compiler_Version" gibt bei mir trotzdem nur 4.0 aus - ist nicht normal, oder?

Ich hoffe Ihr könnt mir helfen - Vielen Dank schon mal,
WHEEZ
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: UTF-8 Bug?

Beitrag von ts-soft »

WHEEZ hat geschrieben: Was anderes noch - ich dachte zwar dass ich die aktuelle 4.0.1 installiert hätte (die IDE zeigts auch an) - aber "Debug #PB_Compiler_Version" gibt bei mir trotzdem nur 4.0 aus - ist nicht normal, oder?
Wer sagt denn, das es Veränderungen am Compiler gab? Vielleicht sind
nur die Libs geupdated worden?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Habe in PB mit UTF-8 noch nie gearbeitet, aber ich rate trotzdem mal: Musst du vielleicht die option »Unicode« in den Compileroptionen aktivieren?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
WHEEZ
Beiträge: 33
Registriert: 15.07.2005 11:39

Beitrag von WHEEZ »

AND51 hat geschrieben:Habe in PB mit UTF-8 noch nie gearbeitet, aber ich rate trotzdem mal: Musst du vielleicht die option »Unicode« in den Compileroptionen aktivieren?
Genau das ist ja mein Problem - wenn ich bei dem Projekt (sehr Umfangreich wie gesagt) die Compilieroption "Unicode" aktiviere, klappt einiges nicht mehr - einige, schon etwas ältere, Komponenten/Libs kommen da nicht klar - gibt nur Fehler über Fehler... Das geht wirklich nicht. Das dürfte aber laut Hilfe auch kein Problem sein. Umgekehrt (also das Einlesen von UTF8 geht auch ohne Probleme).
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

Code: Alles auswählen

CreateFile(0, "C:\test\test2.txt")
WriteStringFormat(0, #PB_UTF8)
WriteString(0, "praiz : 99", #PB_UTF8)
WriteByte(0,%11100010) : WriteByte(0,%10000010) : WriteByte(0,%10101100)
WriteString(0, " (very teuer :[ )", #PB_UTF8)
CloseFile(0)
..ich habe probiert es manuell zu schreiben, bei mir funktioniert's. ich kann dir aber nix zur zuverlässigkeit sagen. eine andere möglichkeit hab ich irgendwie nich' hingekriegt.
my pb stuff..
Bild..jedenfalls war das mal so.
WHEEZ
Beiträge: 33
Registriert: 15.07.2005 11:39

Beitrag von WHEEZ »

So klappt das schon - da schreibe ich ja praktisch selber die nötigen Bytes - aber das ist ja keine Lösung.... Wenn man das erzeugte (richtige) File wieder mit ReadString() einliest und versucht erneut per WriteString() (jeweils mit #PB_UTF8 natürlich) zu schreiben - gibts wieder den Fehler. Ich müsste halt wissen ob es sich dabei wirklich um einen Bug des Compilers handelt, oder nicht. Sollte es ein Bug sein, müsste ich mir eine Hilfs-Funktion (z.B. WriteRealUTF8StringWithNonUnicodeExe() ) schreiben die das vorher parst geradebiegt und byteweise schreibt.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

In einer ASCII-Exe können UTF-8 Strings nur im Speicher existieren, aber
niemals als String! Peek und Poke, aber niemals einem String zuordnen, der
kann nur ASCII :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
WHEEZ
Beiträge: 33
Registriert: 15.07.2005 11:39

Beitrag von WHEEZ »

Ist dann das aus der Hilfe:

WriteString(#Datei, Text$ [, Flags])
#PB_UTF8 : Schreibt den String im UTF8-Format, auch wenn das Programm im Ascii-Modus kompiliert ist

falsch? oder versteh ich da was falsch? Wenn der String eh nicht als UTF-8 existieren kann hat doch der Flag keinen Sinn? ASCII ist ja eine Teilmenge von UTF-8 (dachte ich).
Egal - da ich von vielen String-Funktionen gebrauch mache, brauche ich also dann vor dem Speichern einen ASCII-TO-UTF8 Converter - alla Ascii2Utf8(*BufferVon, *BufferNach) wenn ich eine korrekte UTF8 Datei erzeugen will. Hat da zufällig jemand mal was in die Richtung gesehen?
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

versteh'ichnich.
bei einer Ascii2Utf8(*BufferVon, *BufferNach) , wo im ersten buffer eh nur ascii-zeichen sind brauchst du doch nix konvertieren, da du die ja einfach der WriteString(0,ascii$,#PB_UTF8) -funktion übergeben mußt. wenn im quellbuffer aber utf-8 zeichen drin sind, dann sind sie ja schon im speicher. das #PB_UTF8 -flag ist (scheinbar) nur dazu da ascii-zeichen als utf-8 zu speichern, aber nicht um spezielle utf-8 zeichen zu schreiben.
my pb stuff..
Bild..jedenfalls war das mal so.
WHEEZ
Beiträge: 33
Registriert: 15.07.2005 11:39

Beitrag von WHEEZ »

So wie es aussieht sind nur die Char 0-127 von Ascii (was auch das reine Ascii ist) identisch mit UTF-8. das "€" Zeichen ist aber z.B. char(128) - das hat bei UTF-8 schon 2 Bytes. Alle Zeichen von 128-255 haben in UTF-8 also 2 Bytes.
Gesperrt