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:

[Gelöst] (Sonder)Zeichen umwandeln

 
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: 17.07.2007, 20:31    Titel: [Gelöst] (Sonder)Zeichen umwandeln Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 17.07.2007, 20:41    Titel: Re: Zeichen umwandeln von "Normale?" in UTF-8 ?? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



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

BeitragVerfasst am: 17.07.2007, 20:54    Titel: Antworten mit Zitat

Danke, ich habs lächeln)

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 17.07.2007, 21:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



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

BeitragVerfasst am: 17.07.2007, 21:14    Titel: Antworten mit Zitat

SUPER grinsen happy DANKE

gerade hab ich mich noch gefragt warum meins so eine komische ausgabe liefert ("C" ein Sonderziechen? durchgeknallt )

Dein beispiel macht es wunderbar lächeln
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 17.07.2007, 22:01    Titel: Antworten mit Zitat

kleiner Nachtrag:
Code:
char m[MAX_PATH]={0}; <=>  dim m as zstring *MAX_PATH
so ist es besser übersetzt grinsen
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 cool
(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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



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

BeitragVerfasst am: 17.07.2007, 22:52    Titel: Antworten mit Zitat

Danke fuer den Nachtrag,

volta hat Folgendes geschrieben:

lass das mal ablaufen cool
(noch eine Möglichkeit Umlaute richtig anzuzeigen)


Das hab ich schon unter anderem versucht happy
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
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: 17.07.2007, 23:24    Titel: Antworten mit Zitat

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 grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 18.07.2007, 13:20    Titel: Antworten mit Zitat

Böse Falle:
Code:
if erg<>0 Then buffer=m Else Return buffer
durchgeknallt
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



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

BeitragVerfasst am: 18.07.2007, 15:20    Titel: Antworten mit Zitat

vielen Dank lächeln

jetzt funktioniert es scheinbar fehlerfrei und wandelt alles so um wie ich es mir vorgestellt habe happy

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
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