Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

WString (Option Escape)

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.08.2007, 13:22    Titel: WString (Option Escape) Antworten mit Zitat

Referenz hat Folgendes geschrieben:

Der freeBASIC-Compiler selbst unterstützt inzwischen neben ASCII-Dateien mit
UNICODE-Escape-Sequenzen (\u; siehe dazu erklärend auch OPTION ESCAPE) auch in
UTF-8, UTF-16LE, UTF-16BE, UTF-32LE und in UTF-32BE codierte Quellcodes.


Leider steht nichts genaueres mehr unter WString oder auch Option Escape.

Meine Frage dazu, kann man mit dieser Escape Option einen (W)String mit einem bestimmten Format in ein anderes konvertieren.

zB. einen String mit UTF-8 Textformat in einen ASCII.
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 06.08.2007, 02:52    Titel: Antworten mit Zitat

Eigentlich wollte ich schon vor einer Halben Stunde im Bett sein, aber wie es manchmal so ist gruebelt man immernoch, ausserdem hat mir der Magen geknurrt grinsen durchgeknallt

Code:

Dim test as String="äöü"
?test

Dim buffer as WString ptr
buffer=allocate (len(test)*2)

*buffer+=!"\u;"+test
?*buffer

deallocate (buffer)
sleep


Yahooo!!!!

EDIT:
leider weiss ich jetzt immernoch nicht ob und wie ich einen String mit UTF inhalt konvertieren kann missbilligen
EDIT:
Funktioniert nicht im Grafikmodus
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 07.08.2007, 17:25    Titel: Antworten mit Zitat

Ich würds mit OPEN versuchen, benutz dazu das Keyword ENCODING:

Code:
Dim As Integer hIn, hOut
Dim As String lIn

hIn = FreeFile
Open "UTF_8.txt" FOR INPUT AS #hIn ENCODING "UTF-8"

hOut = FreeFIle
Open "UTF_8.txt" FOR INPUT AS #hIn ENCODING "ASCII"

Do Until EOF(hIn)
   Line Input #hIn, lIn
   Print #hOut, lIn
Loop


// Not Checked... try out on your own.
// nur für sequentielle Modi - INPUT, OUTPUT, RANDOM.
// KeyWords: ENCODING, OPEN (Anweisung)
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 07.08.2007, 17:28    Titel: Antworten mit Zitat

Ja, auf diese Idee war ich auch schon gekommen, das ich aber den UTF-8 String nicht aus einer Datei beziehe, muesste ich dieses erst zwischenspeichern und dann wieder oeffnen und neu einlesen....
Die Methode weare zwar einfach, halte ich allerdings nicht fuer eine Optimale loesung fuer das Problem zwinkern
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 07.08.2007, 17:38    Titel: Antworten mit Zitat

Dann kann ich dir die FB-eigenen Konversions-Funktionen empfehlen. Hatte vor, die in die Ref zu bringen... bevor ich dann den Job fallen lassen hab.

However, in deinem INC-Dir sollte eine Datei "UTF_CONV.BI" sein - #INCLUDE die mal. Du bekommst dann ein paar Func's, die genau das erledigen sollten, was du haben willst. Funzt, glaube ich, ab FBv0.17. Wenn du die BI nicht haben solltest, here's the code:

Code:
#ifndef __utf_conv_bi__
#define __utf_conv_bi__

enum UTF_ENCOD
   UTF_ENCOD_ASCII
   UTF_ENCOD_UTF8
   UTF_ENCOD_UTF16
   UTF_ENCOD_UTF32
end enum

declare function CharToUTF cdecl alias "fb_CharToUTF"       ( byval encod as UTF_ENCOD, _
                                               byval src as zstring ptr, _
                                               byval chars as integer, _
                                               byval dst as any ptr, _
                                               byval bytes as integer ptr ) as any ptr

declare function WCharToUTF cdecl alias "fb_WCharToUTF"    ( byval encod as UTF_ENCOD, _
                                               byval src as wstring ptr, _
                                               byval chars as integer, _
                                               byval dst as any ptr, _
                                               byval bytes as integer ptr ) as any ptr
               
declare function UTFToChar cdecl alias "fb_UTFToChar"       ( byval encod as UTF_ENCOD, _
                                               byval src as any ptr, _
                                               byval dst as zstring ptr, _
                                               byval chars as integer ptr ) as zstring ptr

declare function UTFToWChar cdecl alias "fb_UTFToWChar"    ( byval encod as UTF_ENCOD, _
                                               byval src as any ptr, _
                                               byval dst as wstring ptr, _
                                               byval chars as integer ptr ) as wstring ptr



#endif '' __utf_conv_bi__



Wie ich die Dinger verstanden habe (noch nie benutzt, aber die Namen sagen ja auch schon alles), kannnst du damit ziemlich bequem zwischen den Formaten ASCII, UTF und FB-WSTRING switchen. Nur von WSTRING auf ASCII gehts halt nicht direkt - aber das wäre ja kein Problem zwinkern

Maybe, this helped?



Have a nice day
Ciao
Dusky_Joe
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 07.08.2007, 17:44    Titel: Antworten mit Zitat

geschockt Die habe ich noch gar nicht gekannt...

habe mir fuer diese zwecke inziwschen extra eine eigene Funktione gebastelt

UTF8_to_ASCII
auch zu finden in der Wikipedia.bi
und noch extra eine die umgekehrt arbeitet...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 07.08.2007, 17:58    Titel: Antworten mit Zitat

Kannst ja mal austesten, welche Routine schneller arbeitet happy

Ansonsten hat deine Arbeit sicherlich guten Lehrwert; ich kann mir vorstellen, dass das Ding im FB-Portal gut aufgehoben ist?
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 07.08.2007, 18:20    Titel: Antworten mit Zitat

hmm.. diese ganzen Pointerangelegenheiten machen mich irgendwann noch einmal ganz verrueckt durchgeknallt

wollte das mal ausprobieren und hab es wiefolgt versucht,
Code:

Dim Eingabe as ZString*450
Dim Ausgabe as String
Dim AusgabePtr as Any Ptr=@Ausgabe
Dim ALen as integer Ptr
*ALen=450
Eingabe="öäü abde test ÖÄÜÖÄÜ"

?CharToUTF (UTF_ENCOD_ASCII,Eingabe,450,AusgabePtr,ALen)
?Ausgabe
sleep


so stuerzt es allerdings ab....
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 07.08.2007, 18:36    Titel: Antworten mit Zitat

Das erste, das mir auffällt, ist, dass bei dir 'Ausgabe' ein STRING ist; du brauchst leider ZSTRINGs. Wenn du trotzdem einen normalen STRING benutzen willst, müsstest du wenigstens die Zeile
Code:
Dim AusgabePtr as Any Ptr=@Ausgabe

so abändern:
Code:
DIM AusgabePtr As Any Ptr = StrPtr(Ausgabe)

Und zusätzlich den String-Descriptor manuell updaten (siehe dazu Referenz:String (Dateityp))

Der Absturz kommt aber schon hier zustande:
Code:
*ALen = 450

Du hast in der Zeile erst ALen gedimt, und es hat noch den Wert null. Jetzt versuchst du, in der genannten Zeile, an die Adresse null einen Wert zu schreiben - kann nicht hinhaun. Bin mir derzeit nicht sicher, was der BYTES-Parameter bedeutet... gimme some time of research...



Gib nicht auf, das mit den Pointern ist reine Übungssache. Hatte am Anfang auch ziemliche Probleme mit den Dingern, und jetzt hab ich in ManageMenu Pointer auf Pointer zwinkern
Kommt alles mit der Zeit
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 07.08.2007, 18:40    Titel: Antworten mit Zitat

grinsen geaendert
Code:

Dim Eingabe as ZString*450
Dim Ausgabe as ZString Ptr
Ausgabe=Allocate(450)
Dim AusgabePtr as Any Ptr=@Ausgabe
Dim ALen as integer Ptr
Alen=Allocate(4)
*ALen=450
Eingabe="öäü abde test ÖÄÜÖÄÜ"

?CharToUTF (UTF_ENCOD_ASCII,Eingabe,450,AusgabePtr,ALen)
?*Ausgabe
sleep


Eingabe ist unveraendert, wie es (glaube) sein sollte, aber ausgabe
zeigt mir nun nur den UTF-8 Header an...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 07.08.2007, 19:22    Titel: Antworten mit Zitat

So, hab jetzt ein bisschen gespielt, rausgekommen ist das Programm hier:

Code:
#Include "UTF_conv.bi"

/'
 Variable names:
  first char:  d - direct (no pointer)
               p - pointer
               l - len (integer)
  second char: S - String (Data Type)
               Z - ZString (dito)
               U - UTF-Design (ANY)
               I - Integer
               R - Result (UTF/ANY)
'/

Dim As String      dS
Dim As ZString Ptr pZ
Dim As Integer     lS
Dim As Any Ptr     pU
Dim As Integer Ptr pI
Dim As Any Ptr     pR

dS = "Test"
lS = Len(dS)
pZ = StrPtr(dS)

pU = CAllocate(20)
pI = CAllocate(20)

? "Adresses of:
? " ASCII-String (Source)"
? pZ
? " UTF-Design-Destination:"
? pU

?
? "Content of ZString:"
? *pZ

pR = CharToUTF( UTF_ENCOD_UTF8, _
                pZ, lS, pU, pI )

?
? "Result of operation:"
? pR
? "Where it says (first char):"
? Chr( *Cast(Byte Ptr, pR) )

?
? "Adress of UTF-Design Destination:"
? pU
? "Content of UTF-Design Destination (first char):"
? Chr( *Cast(Byte Ptr, pU) )
? "Content of INTEGER-Buffer (records zero and one):"
? pI[0]
? pI[1]


DeAllocate pU
DeAllocate pI

GetKey


(Da ist jetzt ne Menge Müll drin, den du nicht wirklich brauchst, aber ich habs jetzt einfach mal als einzigen funzenden
Code genommen, den ich grad zur Verfügung hab. Und das ist eben dieser hier, mit dem ich grade noch gespielt hab. Ja ja,
nach dem Spielen die Dinge aufräumen, die man nicht mehr braucht, aber ich denk mal, du wirst dich nicht an der Anzeige
der Adressen stören, die ich noch nicht aufgeräumt hab, oder zwinkern

Anyway...
Du brauchst:
Deinen String dS
Einen ZSTRING pZ
Einen UTF-Buffer im Format ANY pU
Einen INTEGER-Buffer (Nur ein Record, die 20 oben waren nur zum Experimentiern) pI
Einen normalen INTEGER für die Länge. lS

Schreibe den String dS voll.
Ermittle Die Länge, und speichere sie in lS
Kopiere die Adresse des Strings, nicht des Descriptors in pZ (mit StrPtr)
Reserviere Platz für pU - ist ein bisschen Tricky, rauszufinden, wie viele Bytes man braucht, finde ich, am besten
einfach etwas zu viel reservieren. Maximum_Bytes = 4 * lS.

Jetzt hast du alles vorbereitet. Der aufruf ist also wie oben:
Code:
pR = CharToUTF( UTF_ENCOD_UTF8, pZ, lS, pU, pI )

Wobei pR und pU am Ende auf die selbe Stelle deuten, gleich sind. Du kannst auch gerne den Func-Wert verwerfen, da er
seit dem CALLOCATE gleich bleibt, das den Platz für pU reserviert hat.
pI ist meiner Meinung nach ein Puffer, den CharToUTF verwendet, und in dem die Länge von pU in Byts zurückgegeben wird.
Deshalb brauchst du nur ein pI = Callocate(1).
Hat vermutl. den Zweck, dass du im Nachhinein sagen kannst:
Code:
pU = ReAllocate(pU, *pI)

Was den Sinn hat, die überflüssigen Puffer-Bytes los zu werden, die wir mittels 4 * lS reserviert haben.

Ach, ich schreibs als Func:
Code:
#Include "utf_conv.bi"

Declare Function Char2UTF (s As String, encod As UTF_ENCOD = UTF_ENCOD_UTF8) As Any Ptr

Function Char2UTF (s As String, encod As UTF_ENCOD = UTF_ENCOD_UTF8 ) As Any Ptr
   Dim As ZString Ptr pZ
   Dim As Any     Ptr pR
   Dim As Integer     lS
   Dim As Integer Ptr pI

   lS = Len(s)
   pI = CAllocate(1)
   pR = CAllocate(4 * lS)
   pZ = StrPtr(s)
   
   
   CharToUTF( encod, pZ, lS, pR, pI)
   
   pR = ReAllocate(pR, *pI)
   Function = pR
   
   DeAllocate pI
End Function


Dim s As String
Dim b As Byte Ptr            ' Den missbrauchen wir jetzt zur Anzeige des UTF-Strings
s = "Test"

b = Char2UTF(s)
? b

For i As Integer = 0 To 15
   ? b[i], Chr( b[i] )
Next

DeAllocate b
GetKey

Achtung: Hier wird zwar i maximal 15, tatsächlich ist pR bzw. b aber viel kleiner als 16 Bytes. Der Wert in pI wird
nicht zurückgegeben, bist du auf ihn angewiesen, musst du die Routine modifizieren.


Now, maybe that helped happy


Have a nice day
Ciao
Dusky_Joe
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 07.08.2007, 20:21    Titel: Antworten mit Zitat

Vielen Dank, das funktioniert super lächeln

hab es nboch ein klein wenig fuer meine zwecke umgeschrieben.

http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=87
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz