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:

utf8 codierte Textdatei mit input auslesen -> Umlaute

 
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
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 02.10.2011, 12:59    Titel: utf8 codierte Textdatei mit input auslesen -> Umlaute Antworten mit Zitat

Moin Leute!
Ich habe jetzt schon viel herumgesucht, aber nicht das gefunden, was ich brauche.
Ich habe eine Textdatei im Utf8 Zeichensatz, und möchte sie einlesen.
Das ist ja auch nicht weiter schwer, nur Umlaute wie ä, ö, ü, ...etc. werden nicht richtig eingelesen. Der ascii-Wert von einem einglesenen "ü" ist dann auf einmal 252, obwohl er eigentlich 129 sein müsste.

Code:
print asc("ü") 'Ausgabe:  252
print chr(252) 'Ausgabe:  ³

print chr(129) 'Ausgabe:  ü


Ich möchte nämlich überprüfen, ob jedes einzelne Zeichen in der Datei einen Ascii-Wert in einem bestimmten Werte-Bereich hat.
Dafür ist allerdings notwendig, das auch tatsächlich der richtige ascii-Wert zurückgeliefert wird.

Code:
Function check_letter(letter as integer) as integer
    If letter > 64 and letter < 91 then
        check_letter = 1
    elseif letter > 96 and letter < 123 then
        check_letter = 1   
    elseif letter > 127 and letter < 166 then
        check_letter = 1
    end if
end Function

_________________
ICH war mal schizophren, aber jetzt sind WIR okay.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



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

BeitragVerfasst am: 02.10.2011, 13:09    Titel: Antworten mit Zitat

probier mal ob das hier funktioniert, lag noch auf meiner platte rum, leider schon etwas älter und nicht weiter mehr getestet:
Code:

Declare Function StrReplace (Byval StrEx as String, _
                             Byval StrMask as String, _
                             Byval StrRplce as String) as String

Declare Function UTF8_to_ASCII (byval InString as String) as String

'-----------------------------------------------------------------------------'
Function StrReplace (Byval StrEx as String, _
                     Byval StrMask as String, _
                     Byval StrRplce as String) as String
                     
    If Len(StrEx)=0 or Len(StrMask)>Len(StrEx) Then Return StrEx
   
    Dim Buffer as String=StrEx
    Dim MaskSearch as UInteger
    Dim MFound as byte
    Dim lp as UInteger=1
   
    Do
        MaskSearch=InStr(lp,Buffer,StrMask)
        MFound=0
       
        If MaskSearch Then
            MFound=1:lp=MaskSearch+Len(StrRplce)
           
            ''
            Buffer=Left(Buffer,MaskSearch-1)+ _
            StrRplce+ _
            Right(Buffer,Len(Buffer)-(MaskSearch+(Len(StrMask)-1)))
            ''
           
        End If
   
    Loop while MFound=1
   
    Return Buffer
End Function

Function UTF8_to_ASCII (byval InString as String) as String
    Dim OutString as String=InString
   
    OutString=StrReplace (OutString, chr(226,130,172), chr(128))
    OutString=StrReplace (OutString, chr(194,129), chr(129))
    OutString=StrReplace (OutString, chr(226,128,154), chr(130))
    OutString=StrReplace (OutString, chr(198,146), chr(131))
    OutString=StrReplace (OutString, chr(226,128,158), chr(132))
    OutString=StrReplace (OutString, chr(226,128,166), chr(133))
    OutString=StrReplace (OutString, chr(226,128,160), chr(134))
    OutString=StrReplace (OutString, chr(226,128,161), chr(135))
    OutString=StrReplace (OutString, chr(203,134), chr(136))
    OutString=StrReplace (OutString, chr(226,128,176), chr(137))
    OutString=StrReplace (OutString, chr(197,160), chr(138))
    OutString=StrReplace (OutString, chr(226,128,185), chr(139))
    OutString=StrReplace (OutString, chr(197,146), chr(140))
    OutString=StrReplace (OutString, chr(194,141), chr(141))
    OutString=StrReplace (OutString, chr(197,189), chr(142))
    OutString=StrReplace (OutString, chr(194,143), chr(143))
    OutString=StrReplace (OutString, chr(194,144), chr(144))
    OutString=StrReplace (OutString, chr(226,128,152), chr(145))
    OutString=StrReplace (OutString, chr(226,128,153), chr(146))
    OutString=StrReplace (OutString, chr(226,128,156), chr(147))
    OutString=StrReplace (OutString, chr(226,128,157), chr(148))
    OutString=StrReplace (OutString, chr(226,128,162), chr(149))
    OutString=StrReplace (OutString, chr(226,128,147), chr(150))
    OutString=StrReplace (OutString, chr(226,128,148), chr(151))
    OutString=StrReplace (OutString, chr(203,156), chr(152))
    OutString=StrReplace (OutString, chr(226,132,162), chr(153))
    OutString=StrReplace (OutString, chr(197,161), chr(154))
    OutString=StrReplace (OutString, chr(226,128,186), chr(155))
    OutString=StrReplace (OutString, chr(197,147), chr(156))
    OutString=StrReplace (OutString, chr(194,157), chr(157))
    OutString=StrReplace (OutString, chr(197,190), chr(158))
    OutString=StrReplace (OutString, chr(197,184), chr(159))
    OutString=StrReplace (OutString, chr(194,160), chr(160))
    OutString=StrReplace (OutString, chr(194,161), chr(161))
    OutString=StrReplace (OutString, chr(194,162), chr(162))
    OutString=StrReplace (OutString, chr(194,163), chr(163))
    OutString=StrReplace (OutString, chr(194,164), chr(164))
    OutString=StrReplace (OutString, chr(194,165), chr(165))
    OutString=StrReplace (OutString, chr(194,166), chr(166))
    OutString=StrReplace (OutString, chr(194,167), chr(167))
    OutString=StrReplace (OutString, chr(194,168), chr(168))
    OutString=StrReplace (OutString, chr(194,169), chr(169))
    OutString=StrReplace (OutString, chr(194,170), chr(170))
    OutString=StrReplace (OutString, chr(194,171), chr(171))
    OutString=StrReplace (OutString, chr(194,172), chr(172))
    OutString=StrReplace (OutString, chr(194,173), chr(173))
    OutString=StrReplace (OutString, chr(194,174), chr(174))
    OutString=StrReplace (OutString, chr(194,175), chr(175))
    OutString=StrReplace (OutString, chr(194,176), chr(176))
    OutString=StrReplace (OutString, chr(194,177), chr(177))
    OutString=StrReplace (OutString, chr(194,178), chr(178))
    OutString=StrReplace (OutString, chr(194,179), chr(179))
    OutString=StrReplace (OutString, chr(194,180), chr(180))
    OutString=StrReplace (OutString, chr(194,181), chr(181))
    OutString=StrReplace (OutString, chr(194,182), chr(182))
    OutString=StrReplace (OutString, chr(194,183), chr(183))
    OutString=StrReplace (OutString, chr(194,184), chr(184))
    OutString=StrReplace (OutString, chr(194,185), chr(185))
    OutString=StrReplace (OutString, chr(194,186), chr(186))
    OutString=StrReplace (OutString, chr(194,187), chr(187))
    OutString=StrReplace (OutString, chr(194,188), chr(188))
    OutString=StrReplace (OutString, chr(194,189), chr(189))
    OutString=StrReplace (OutString, chr(194,190), chr(190))
    OutString=StrReplace (OutString, chr(194,191), chr(191))
    OutString=StrReplace (OutString, chr(195,128), chr(192))
    OutString=StrReplace (OutString, chr(195,129), chr(193))
    OutString=StrReplace (OutString, chr(195,130), chr(194))
    OutString=StrReplace (OutString, chr(195,131), chr(195))
    OutString=StrReplace (OutString, chr(195,132), chr(196))
    OutString=StrReplace (OutString, chr(195,133), chr(197))
    OutString=StrReplace (OutString, chr(195,134), chr(198))
    OutString=StrReplace (OutString, chr(195,135), chr(199))
    OutString=StrReplace (OutString, chr(195,136), chr(200))
    OutString=StrReplace (OutString, chr(195,137), chr(201))
    OutString=StrReplace (OutString, chr(195,138), chr(202))
    OutString=StrReplace (OutString, chr(195,139), chr(203))
    OutString=StrReplace (OutString, chr(195,140), chr(204))
    OutString=StrReplace (OutString, chr(195,141), chr(205))
    OutString=StrReplace (OutString, chr(195,142), chr(206))
    OutString=StrReplace (OutString, chr(195,143), chr(207))
    OutString=StrReplace (OutString, chr(195,144), chr(208))
    OutString=StrReplace (OutString, chr(195,145), chr(209))
    OutString=StrReplace (OutString, chr(195,146), chr(210))
    OutString=StrReplace (OutString, chr(195,147), chr(211))
    OutString=StrReplace (OutString, chr(195,148), chr(212))
    OutString=StrReplace (OutString, chr(195,149), chr(213))
    OutString=StrReplace (OutString, chr(195,150), chr(214))
    OutString=StrReplace (OutString, chr(195,151), chr(215))
    OutString=StrReplace (OutString, chr(195,152), chr(216))
    OutString=StrReplace (OutString, chr(195,153), chr(217))
    OutString=StrReplace (OutString, chr(195,154), chr(218))
    OutString=StrReplace (OutString, chr(195,155), chr(219))
    OutString=StrReplace (OutString, chr(195,156), chr(220))
    OutString=StrReplace (OutString, chr(195,157), chr(221))
    OutString=StrReplace (OutString, chr(195,158), chr(222))
    OutString=StrReplace (OutString, chr(195,159), chr(223))
    OutString=StrReplace (OutString, chr(195,160), chr(224))
    OutString=StrReplace (OutString, chr(195,161), chr(225))
    OutString=StrReplace (OutString, chr(195,162), chr(226))
    OutString=StrReplace (OutString, chr(195,163), chr(227))
    OutString=StrReplace (OutString, chr(195,164), chr(228))
    OutString=StrReplace (OutString, chr(195,165), chr(229))
    OutString=StrReplace (OutString, chr(195,166), chr(230))
    OutString=StrReplace (OutString, chr(195,167), chr(231))
    OutString=StrReplace (OutString, chr(195,168), chr(232))
    OutString=StrReplace (OutString, chr(195,169), chr(233))
    OutString=StrReplace (OutString, chr(195,170), chr(234))
    OutString=StrReplace (OutString, chr(195,171), chr(235))
    OutString=StrReplace (OutString, chr(195,172), chr(236))
    OutString=StrReplace (OutString, chr(195,173), chr(237))
    OutString=StrReplace (OutString, chr(195,174), chr(238))
    OutString=StrReplace (OutString, chr(195,175), chr(239))
    OutString=StrReplace (OutString, chr(195,176), chr(240))
    OutString=StrReplace (OutString, chr(195,177), chr(241))
    OutString=StrReplace (OutString, chr(195,178), chr(242))
    OutString=StrReplace (OutString, chr(195,179), chr(243))
    OutString=StrReplace (OutString, chr(195,180), chr(244))
    OutString=StrReplace (OutString, chr(195,181), chr(245))
    OutString=StrReplace (OutString, chr(195,182), chr(246))
    OutString=StrReplace (OutString, chr(195,183), chr(247))
    OutString=StrReplace (OutString, chr(195,184), chr(248))
    OutString=StrReplace (OutString, chr(195,185), chr(249))
    OutString=StrReplace (OutString, chr(195,186), chr(250))
    OutString=StrReplace (OutString, chr(195,187), chr(251))
    OutString=StrReplace (OutString, chr(195,188), chr(252))
    OutString=StrReplace (OutString, chr(195,189), chr(253))
    OutString=StrReplace (OutString, chr(195,190), chr(254))
    OutString=StrReplace (OutString, chr(195,191), chr(255))

    Return OutString
End Function


_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 02.10.2011, 13:13    Titel: Antworten mit Zitat

Hallo,

hast du beim Öffnen der Datei das ENCODING-Schlüsselwort benutzt?

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 02.10.2011, 13:16    Titel: Antworten mit Zitat

Hey Super! Gleich zwei gute Hilfen!
Werde es mal probieren.
_________________
ICH war mal schizophren, aber jetzt sind WIR okay.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Luke



Anmeldungsdatum: 14.01.2009
Beiträge: 92
Wohnort: Ostfriesland !

BeitragVerfasst am: 02.10.2011, 13:43    Titel: Antworten mit Zitat

hmm, also irgentwie bekomme ich es immernoch nicht hin. Weder encoding funzt, noch Eternal_pains Lösung....

Code:
Dim as string z

Open "Text.txt" for input encoding "UTF-8" as #1
    Do until eof(1)
    line input #1, z
    print z
    loop
close #1
sleep


In der Text.txt steht

Code:
ü
Ü
ä
ß
é


In der Konsole wird allerdings nichts angezeigt.
_________________
ICH war mal schizophren, aber jetzt sind WIR okay.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 02.10.2011, 14:02    Titel: Antworten mit Zitat

UTF8 <> ASCII

Die Werte für >127 Zeichen unterscheiden sich eben. Wenn du schon UTF8 einliest, musst du das natürlich in einen WString machen, Strings sind für ASCII da.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



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

BeitragVerfasst am: 02.10.2011, 14:10    Titel: Antworten mit Zitat

Ich vermute da auch eine verwechslung, denn wenn nicht anders angegeben, wird standardmässig in ANSI gespeichert...

das wurde hier mal gemacht:
http://forum.qbasic.at/viewtopic.php?t=4652&highlight=ansi+ascii
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Sannaj



Anmeldungsdatum: 19.12.2010
Beiträge: 35

BeitragVerfasst am: 02.10.2011, 23:38    Titel: Antworten mit Zitat

Wenn du die UTF-8 Übermenge nicht "verstehen" musst, reicht es völlig aus, sie einfach zu ignorieren. Alle UTF-8 Zeichen >0x7F verhalten sich dann wie eine Gruppe irgendwelche Zeichen aus 0x80 bis 0xFF.

Wichtig ist aber: UTF-8 können auch mehre Byte lang sein.

Die Möglichkeit mit wstring geht auch, muss aber erst konvertiert werden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 03.10.2011, 01:53    Titel: Antworten mit Zitat

Grundsätzlich ist die Unicode Unterstützung vom FBC/FBRTL eher ... schlecht als recht. Der Unicodesupport ist aber irgendwie in den meisten Hochsprachen noch ziemlich meh, aber ich befürchte, dass sich das nie wirklich bessern wird. Unicode ist halt einfach ein extrem komplexes Thema (besonders wenn dann noch die UCS-Varianten ins Spiel kommen), womit man sich als 0815 Anfänger nicht befassen mag. Unicode macht eigentlich nur halbwegs Spaß, wenn man eine wirklich reinrassige Umgebung des gleichen Unicodes-Standards hat. Also UTF-8 Daten, Ein/Ausgabe, Verarbeitung unter Linux und UTF-16 (oder war es doch UCS-16? durchgeknallt) unter Windows. Mac ist ja eh irrelevant. Alternativ konvertiert man alles in UTF-8, das ist meistens am einfachsten von der Handhabung her, solange man nicht annimmt, dass es kein Multibyte ist....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RWK



Anmeldungsdatum: 04.07.2011
Beiträge: 44

BeitragVerfasst am: 03.10.2011, 11:53    Titel: Antworten mit Zitat

Ja, das macht immer wieder Spaß....

So hab ich hier ein Programm das unter FreeBasic ASCII in ein SQLite Datenbank schreibt.... (UTF-8 als Standard), wenn ich die dann unter Excel (UTF-16..meine ich) wieder auslese, krieg ich das per SQLite Treiber ums verrecken nicht hin, das die Umlaute korrekt dargestellt werden, obwohl bis zum MSQuery Programm noch alles 1a ankommt.
Dann halt direkt per FreeBasic.DLL unter Excel die Daten abfragen lächeln

Grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sannaj



Anmeldungsdatum: 19.12.2010
Beiträge: 35

BeitragVerfasst am: 03.11.2011, 21:53    Titel: Antworten mit Zitat

Dann geht das nur mit einer Entsprechenden Konvertierfunktion. Da UTF-16 von fb nur mit wstring unter Windows unterstuetzt wird, schreibst du dir am bessten selber eine (ist eigentlich zimlich einfach, die den String dann auf einen ushort-Array darstellt +0x0000, bevor du ihn in die Datenbank schreibst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 03.11.2011, 22:11    Titel: Antworten mit Zitat

Sannaj hat Folgendes geschrieben:
Dann geht das nur mit einer Entsprechenden Konvertierfunktion. Da UTF-16 von fb nur mit wstring unter Windows unterstuetzt wird, schreibst du dir am bessten selber eine (ist eigentlich zimlich einfach, die den String dann auf einen ushort-Array darstellt +0x0000, bevor du ihn in die Datenbank schreibst.
Äh.. nein. Unicodehandling sollte immer von kompetenten Bibiliotheken wie iconv erledigt werden. Alles andere ist derbster Pfusch, der am Ende nur hin und wieder funktioniert.

Okay, solange du wirklich nur reines ASCII schreibst, kann man zwar einfach ein Nullbyte voranstellen (aber nur bei UTF-16 oder UCS-16!) und gut is. Es ist aber sehr wahrscheinlich, dass hier ein Mischmasch aus ASCII und ANSI/Windows-1252 vorliegt, und da siehts wieder ganz anders aus...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
darksider3



Anmeldungsdatum: 01.10.2011
Beiträge: 25
Wohnort: Münster

BeitragVerfasst am: 05.11.2011, 00:41    Titel: Antworten mit Zitat

Nur um alles abzurunden, es gibt einen Hilfreichen Artikel bei Wikipdedia(Nur ums Klarzustellen, ich möchte das nur als ergänzung in diesem thread wissen grinsen )
Wikipedia ASCII Tabelle
Auszug:
Zitat:

Dez Hex Okt ASCII
0 0x00 000 NUL
1 0x01 001 SOH
2 0x02 002 STX
3 0x03 003 ETX
4 0x04 004 EOT
5 0x05 005 ENQ
6 0x06 006 ACK
7 0x07 007 BEL
8 0x08 010 BS
9 0x09 011 TAB
10 0x0A 012 LF
11 0x0B 013 VT

Ist ASCII eigentlich hexadezimal oder Dezimal??
_________________
Meine Website
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 05.11.2011, 00:52    Titel: Antworten mit Zitat

Das ist ziemlich egal - eine Zahl ist eine Zahl, egal in welchem System du sie darstellen willst. 0x... ist jedenfalls hexadezimal (auch am vorkommenden A und B erkennbar happy )
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 06.11.2011, 12:34    Titel: Antworten mit Zitat

Eternal_pain hat Folgendes geschrieben:
Function UTF8_to_ASCII (byval InString as String) as String
Dim OutString as String=InString

OutString=StrReplace (OutString, chr(226,130,172), chr(128))
OutString=StrReplace (OutString, chr(194,129), chr(129))
OutString=StrReplace (OutString, chr(226,128,154), chr(130))
...
OutString=StrReplace (OutString, chr(195,189), chr(253))
OutString=StrReplace (OutString, chr(195,190), chr(254))
OutString=StrReplace (OutString, chr(195,191), chr(255))

Return OutString
End Function[/code]

Ist in dieser Form eher unschön und vor allem problematisch: Die Ziel-"DOS"-Zeichen (meines Wissens verwendet FB anscheinend immer noch Codepage 437) können rasch einmal per Zufall neue Unicode-Zeichen darstellen, die von einem späteren StrReplace() gleich noch einmal ersetzt werden...

Wenn hier jemand etwas Sauberes auf die Beine stellen möchte, dann sollte man sich auf www.unicode.org erst einmal ausreichend "warm lesen", im Speziellen verstehen, wie UTF-8 funktioniert. An dieser Stelle ist auch

http://de.wikipedia.org/wiki/UTF-8#Kodierung

sehr lesenswert: Eine Verarbeitungsroutine sollte grundsätzlich den hier als Byte-Array betrachteten String Byte für Byte durchgehen und anhand der Bitmuster (IF mit AND-Masken!) entsprechend reagieren.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
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