 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 05.08.2007, 13:22 Titel: WString (Option Escape) |
|
|
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 06.08.2007, 02:52 Titel: |
|
|
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
Code: |
Dim test as String="äöü"
?test
Dim buffer as WString ptr
buffer=allocate (len(test)*2)
*buffer+=!"\u;"+test
?*buffer
deallocate (buffer)
sleep
|
EDIT:
leider weiss ich jetzt immernoch nicht ob und wie ich einen String mit UTF inhalt konvertieren kann
EDIT:
Funktioniert nicht im Grafikmodus _________________
 |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 07.08.2007, 17:25 Titel: |
|
|
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 07.08.2007, 17:28 Titel: |
|
|
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  _________________
 |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 07.08.2007, 17:38 Titel: |
|
|
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
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 07.08.2007, 17:44 Titel: |
|
|
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 |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 07.08.2007, 17:58 Titel: |
|
|
Kannst ja mal austesten, welche Routine schneller arbeitet
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 07.08.2007, 18:20 Titel: |
|
|
hmm.. diese ganzen Pointerangelegenheiten machen mich irgendwann noch einmal ganz verrueckt
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 |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 07.08.2007, 18:36 Titel: |
|
|
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:
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
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 07.08.2007, 18:40 Titel: |
|
|
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 |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 07.08.2007, 19:22 Titel: |
|
|
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
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
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
|
Nach oben |
|
 |
|
|
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.
|
|