 |
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: 17.07.2007, 20:31 Titel: [Gelöst] (Sonder)Zeichen umwandeln |
|
|
Auf der suche nach etwas das mir FB/Normalen Text in UTF umwandeln kann bin ich auf das hier gestossen, leider in C und beinhaltet Funktionen der Win API, vielleicht koennte mir diesen kurzen Source in FB uebersetzen ??
bzw. was bedeutet
char m[MAX_PATH]={0};
und
WCHAR w[MAX_PATH]={0};
was ist MAX_PATH ?
und was ist ein CString?
Code: | '------------------------
char m[MAX_PATH]={0};
WCHAR w[MAX_PATH]={0};
CString text;
int erg=0;
strcpy(m, "ABCdefÄÖÜäöüéÉ");
erg=MultiByteToWideChar(CP_ACP, 0, m, -1, w, sizeof(w) / sizeof(WCHAR));
erg=WideCharToMultiByte(CP_UTF8, 0, w, -1, m, sizeof(m), 0, 0);
text=m;
'-------------------------- |
_________________

Zuletzt bearbeitet von Eternal_pain am 24.07.2007, 06:30, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 17.07.2007, 20:41 Titel: Re: Zeichen umwandeln von "Normale?" in UTF-8 ?? |
|
|
Eternal_pain hat Folgendes geschrieben: | was ist MAX_PATH ? | MAX_PATH ist eine Konstante (?) aus der windows.bi, bzw. der von dieser includeten Dateien. _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 17.07.2007, 20:54 Titel: |
|
|
Danke, ich habs )
Code: |
#include "windows.bi"
'------------------------
Dim m as Char ptr
Dim w as WChar ptr
Dim Text as String
Dim erg as integer=0
m=allocate(MAX_PATH)
w=allocate(MAX_PATH)
m[MAX_PATH]=0
w[MAX_PATH]=0
lstrcpy(m, "ABCdefÄÖÜäöüéÉ")
erg=MultiByteToWideChar(CP_ACP, 0, m, -1, w, sizeof(w) / sizeof(WCHAR))
erg=WideCharToMultiByte(CP_UTF8, 0, w, -1, m, sizeof(m), 0, 0)
text=*m
?text
'--------------------------
sleep
|
_________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 17.07.2007, 21:11 Titel: |
|
|
versuch es mal besser so: Code: | #include "windows.bi"
dim m as string *MAX_PATH
dim w as wstring *MAX_PATH
dim text as string
dim as integer erg=0
m="ABCdefÄÖÜäöüéÉ"
?m
erg=MultiByteToWideChar(CP_ACP, 0, m, -1, w, sizeof(w) / sizeof(WCHAR))
erg=WideCharToMultiByte(CP_UTF8, 0, w, -1, m, sizeof(m), 0, 0)
text=m
?text
sleep
end |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 17.07.2007, 21:14 Titel: |
|
|
SUPER DANKE
gerade hab ich mich noch gefragt warum meins so eine komische ausgabe liefert ("C" ein Sonderziechen? )
Dein beispiel macht es wunderbar  _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 17.07.2007, 22:01 Titel: |
|
|
kleiner Nachtrag:
Code: | char m[MAX_PATH]={0}; <=> dim m as zstring *MAX_PATH | so ist es besser übersetzt
Code: | sizeof(w) / sizeof(WCHAR) <=> sizeof(w) \2 | sizeof(WCHAR) ist konstant 2.
EDIT/
Code: | #include "windows.bi"
dim m as zstring *MAX_PATH
dim w as wstring *MAX_PATH
dim as integer erg=0
m="ABCdefÄÖÜäöüéÉ"
?m
erg=MultiByteToWideChar(CP_ACP, 0, m, -1, w, sizeof(w)\2)
erg=WideCharToMultiByte(CP_OEMCP, 0, w, -1, m, sizeof(m), 0, 0)
?m
sleep
end | lass das mal ablaufen
(noch eine Möglichkeit Umlaute richtig anzuzeigen) _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 17.07.2007, 22:52 Titel: |
|
|
Danke fuer den Nachtrag,
volta hat Folgendes geschrieben: |
lass das mal ablaufen
(noch eine Möglichkeit Umlaute richtig anzuzeigen)
|
Das hab ich schon unter anderem versucht
wollte mit dem Code eine kleine routine schreiben
um meine eigenen konvertierungs funktionen zu basteln
ohne jedes einzelne Sonderzeichen erst einmal zu suchen. _________________
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 17.07.2007, 23:24 Titel: |
|
|
nachdem ich grad gemerkt hat wieviele sonderzeichen zu aendern sind bei den verschiedenen Formaten, dachte ich mir ich nehm einfach das was ich da hab
Code: |
#include once "windows.bi"
dim m as zstring *MAX_PATH
dim w as wstring *MAX_PATH
dim as integer erg=0
m="ABCdefÄÖÜäöüéÉ"
?m
erg=MultiByteToWideChar(CP_ACP, 0, m, -1, w, sizeof(w)\2)
erg=WideCharToMultiByte(UTF8, 0, w, -1, m, sizeof(m), 0, 0)
?m
sleep
end
|
Das Beispiel von Volta funktioniert problemlos
jetzt wollte ich mir das ganze aber als funktion machen
Code: |
#include once "windows.bi"
#Define ANSI 0
#Define UNI 1
#Define UTF8 65001
Function StringFormat (byval buffer as String, _
byval InMode as Integer, _
byval OutMode as Integer) as String
If len(Trim(buffer))=0 then exit function
dim m as zstring *MAX_PATH
dim w as wstring *MAX_PATH
dim erg as integer=0
m=buffer
?m
erg=MultiByteToWideChar(InMode, 0, m, -1, w, sizeof(w) / sizeof(WCHAR))
erg=WideCharToMultiByte(OutMode, 0, w, -1, m, sizeof(m), 0, 0)
?m
if erg<>0 Then buffer=m Else Return buffer
Return trim(buffer)
End Function
?StringFormat("ABCdefÄÖÜäöüéÉ",ANSI,UTF8)
sleep
|
ANSI zu UNI geht, aber bei ANSI zu UTF8 bleib er einfach haengen, dabei ist es doch eigentlich genau das selbe wie auch da oben ? _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 18.07.2007, 13:20 Titel: |
|
|
Böse Falle: Code: | if erg<>0 Then buffer=m Else Return buffer |
buffer wird mit einer Länge von 14 Zeichen übergeben, bei Ansi->UTF8 erweitert er sich auf 22 Byte, wohin damit?
versuchs mal so: Code: | #include once "windows.bi"
#Define ANSI 0
#Define UNI 1
#Define UTF8 65001
Function StringFormat (Byval buffer As String, _
Byval InMode As Integer, _
Byval OutMode As Integer) As String
Dim x As Integer = Len(Trim(buffer))
If x = 0 or x > MAX_PATH-1 Then Return buffer
Dim m As Zstring *MAX_PATH
Dim w As Wstring *MAX_PATH
m = Trim(buffer)
If MultiByteToWideChar(InMode, 0, m, -1, w, Sizeof(w) \2 ) = 0 Then Return "" 'buffer
If WideCharToMultiByte(OutMode, 0, w, -1, m, Sizeof(m), 0, 0) = 0 Then Return "" 'buffer
Return m
End Function
dim t as string
t=" ABCdefÄÖÜäöüéÉ "
?StringFormat(t,ANSI,UTF8)
?StringFormat(t,ANSI,UNI)
?StringFormat("ABCdefÄÖÜäöüéÉ",ANSI,UTF8)
?StringFormat("ABCdefÄÖÜäöüéÉ",ANSI,UNI)
Sleep | Wenn du es auch zur Umwandlung größerer Zeichenketten verwenden willst musst du MAX_PATH durch eine größere Konstante ersetzen! _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 18.07.2007, 15:20 Titel: |
|
|
vielen Dank
jetzt funktioniert es scheinbar fehlerfrei und wandelt alles so um wie ich es mir vorgestellt habe
Das Problem mit evtl groesseren Strings hab ich nun erst einmal so geloest
allerdings noch nicht ausgiebig getestet, sollte so aber gehen...
Edit:
Hab die Aufruf Funktion noch etwas geaendert, da ich nicht bedacht habe
das eine umwandlung zu UTF8 einen bis zu drei mal so langen String zurueck liefern kann, als das original.
Code: |
'Hintergrund Funktion
Function StringFormat_ (Byval buffer As String, _
Byval InMode As Integer, _
Byval OutMode As Integer) As String
If Len(buffer)=0 Then Return ""
Dim m As Zstring *MAX_PATH
Dim w As Wstring *MAX_PATH
m = Trim(buffer)
If MultiByteToWideChar(InMode, 0, m, -1, w, Sizeof(w) \2 ) = 0 Then Return "" 'buffer
If WideCharToMultiByte(OutMode, 0, w, -1, m, Sizeof(m), 0, 0) = 0 Then Return "" 'buffer
Return m
End Function
'Aufruf Funktion
Function StringFormat (Byval buffer As String, _
Byval InMode As Integer, _
Byval OutMode As Integer) As String
Dim holder As String
Dim SplitString As String
Dim Max_Split as Integer
Max_Split=IIf (OutMode=UTF8,MAX_PATH\3,MAX_PATH)
Do
If Len(buffer)-1>Max_Split Then
SplitString=Mid(buffer,1,Max_Split-1)
buffer=Mid(buffer,Max_Split,(Len(buffer)+1)-Max_Split)
holder+=StringFormat_ (SplitString,InMode,OutMode)
Else
holder+=StringFormat_ (buffer,InMode,OutMode)
Exit Do
End If
Loop
Return Trim(holder)
End Function
|
Code: |
dim t as string
dim test as string
t=" ABCdefÄÖÜäöüéÉ "
test=StringFormat(t,ANSI,UTF8)
t=StringFormat(test,UTF8,UNI)
?t
Sleep |
_________________
 |
|
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.
|
|