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

Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 02.10.2011, 12:59 Titel: utf8 codierte Textdatei mit input auslesen -> Umlaute |
|
|
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 02.10.2011, 13:09 Titel: |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Luke

Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 02.10.2011, 13:16 Titel: |
|
|
Hey Super! Gleich zwei gute Hilfen!
Werde es mal probieren. _________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
 |
Luke

Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 02.10.2011, 13:43 Titel: |
|
|
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
In der Konsole wird allerdings nichts angezeigt. _________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 02.10.2011, 14:02 Titel: |
|
|
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
|
Nach oben |
|
 |
Sannaj
Anmeldungsdatum: 19.12.2010 Beiträge: 35
|
Verfasst am: 02.10.2011, 23:38 Titel: |
|
|
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 03.10.2011, 01:53 Titel: |
|
|
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? ) 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 |
|
 |
RWK
Anmeldungsdatum: 04.07.2011 Beiträge: 44
|
Verfasst am: 03.10.2011, 11:53 Titel: |
|
|
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
Grüße |
|
Nach oben |
|
 |
Sannaj
Anmeldungsdatum: 19.12.2010 Beiträge: 35
|
Verfasst am: 03.11.2011, 21:53 Titel: |
|
|
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 03.11.2011, 22:11 Titel: |
|
|
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 |
|
 |
darksider3
Anmeldungsdatum: 01.10.2011 Beiträge: 25 Wohnort: Münster
|
Verfasst am: 05.11.2011, 00:41 Titel: |
|
|
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 )
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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 05.11.2011, 00:52 Titel: |
|
|
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 ) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 06.11.2011, 12:34 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|