UTF-8 Bug?

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

ts-soft hat geschrieben: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:
Heißt dass, dass das Vorhaben von WHEELZ mit WriteData() funktioniert?

Probier das mal, WHEELZ.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

natürlich funktioniert es, kommt aber auf das selbe raus wie mit meinem code.
my pb stuff..
Bild..jedenfalls war das mal so.
WHEEZ
Beiträge: 33
Registriert: 15.07.2005 11:39

Beitrag von WHEEZ »

Das geht schon - klar... ich schreibe ja einen Speicherbereich per WriteData() - da ist es ziemlich egal was da im Speicher steht - PB weiss ja nicht mal dass es sich dabei um einen String handelt. Problem ist eben nur dass ich nicht nur direkt im Speicher arbeiten kann, da ich wie gesagt sehr viele normale String-Funktionene vor dem Speichern anwende. Sowas wie ReplaceString() lässt sich halt schlecht auf einen Speicherbereich anwenden... Intern funktioniert alles wie ich es gerne haben möchte - also als ASCII alles perfekt.
Ich möchte eigentlich nix andere haben, als es z.B. Notepad macht.... da kann ich ja auch einfach eine ASCII Datei aufmachen - geh dann auf "Speichern unter", wähle Format UTF-8 aus und fertig.
Ich hab gerade einen Link aus dem Chat bekommen:
http://everything2.com/index.pl?node_id=1455367
in die Richtung geht das glaube ich. Leider bin ich weder in C noch PERL so recht fit - bei dem Shift/Hex Operationen und Zusammengefummel steig ich aus - wie würde das in PB aussehen?
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

das was du "nur" möchtest ist aber eigentlich nichts anderes als unicode compatibilität (wie eben z.b. in notepad). und das geht eben nur über die entsprechende option. es ist nicht das problem ascii in utf-8 zu überführen, das passiert ja wie gesagt automatisch. das problem sind die nicht-ascii-zeichen. die PB-string-funktionen werden sowieso auf speicherbereiche angewandt (wie alles andere auch), nur wie die speicherbereiche interpretiert werden, hängt eben von der option ab.
my pb stuff..
Bild..jedenfalls war das mal so.
WHEEZ
Beiträge: 33
Registriert: 15.07.2005 11:39

Beitrag von WHEEZ »

Hmm - mit der Option "Unicode" würd das ja alles recht easy gehen - die Möglichkeit hab ich aber wie gesagt nicht - ich brauche also den Converter weil meine Exe leider eine Nicht-Unicode Exe bleiben wird. Wenn ich Unicode aktiviere, haut hinten und vorne nichts mehr hin - da kommen die seltsamsten Fehlermeldungen - und das Massenweise.... Da sind zu viele Libs, Includes und API Calls miteinander am werkeln - das zu debuggen würde ewig dauern...
WHEEZ
Beiträge: 33
Registriert: 15.07.2005 11:39

Beitrag von WHEEZ »

Also - inzwischen bin ich etwas schlauer. Die Function um Ascii in Utf8 zu wandeln, habe ich nachgebaut - funktioniert auch. Das Problem mit dem € wird damit aber nicht aus der Welt geschafft. beim €-Zeichen gibt es eine Ausnahme. Als Ascii wird da normalerweise 128 als Wert zurückgegeben. Das ist aber eigentlich falsch - das richtige €-Zeichen hat offiziell den Code 8364. bei Utf8 wird das auch so verwendet. Bei der Umwandlung müsste man das eben speziell abfangen. Und genau das macht der Flag #PB_UTF8 bei WriteString() wenn er in einer Ascii-Exe ausgeführt wird nicht. Ob das jetzt ein Bug ist oder nicht... will ich nicht beurteilen
Die Frage ist jetzt wie man das am besten manuell machen/korregieren kann.

Mein erster Versuch ist:

Code: Alles auswählen

Procedure.s WriteStringAsciiToUtf8(file, string$)
  c = Asc(Mid(string$, i, 1))
  For i = 1 To Len(string$)
    c = Asc(Mid(string$, i, 1))
    If c < 128
      WriteByte(file,c)
    Else
      If c = 128
        WriteByte(file,$E2) : WriteByte(0,$82) : WriteByte(0,$AC) 
      Else
        WriteByte(file, (c>>6)|192)
        WriteByte(file, (c&63)|128)
      EndIf
    EndIf
  Next i
EndProcedure

CreateFile(0, "D:\daten\test.txt") 
test$ = "€ äöü";
WriteStringFormat(0, #PB_UTF8)
;WriteString(0,test$, #PB_UTF8) 
WriteStringAsciiToUtf8(0,test$)
CloseFile(0)
Leider wird das bestimmt nicht besonders schnell sein (habs aber noch nicht getestet und verglichen). Das andere Problem ist dann noch: das €-Zeichen wird da wohl nicht die einzige Ausnahme sein. bei den ersten Versuchen hat sich z.B. das >„< auch als so ein Zeichen herausgestellt... wird man halt mal alle > 128 durchgehen müssen - sind bestimmt noch einige dieser Sonder 3-Bit Ausnahmen dabei.
Gesperrt