|
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 |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 30.11.2017, 21:09 Titel: Datei im UTF-8 Format ohne BOM? |
|
|
Wenn ich in die Hilfedatei reinschaue, steht da folgender Satz drin:
Zitat: | Achtung: ENCODING kann zusammen mit UTF-codierten Dateien nur dann erfolgreich eingesetzt werden, wenn das Byte Order Mark (BOM) gesetzt ist und mit der angegebenen Codierung übereinstimmt. Ansonsten wird der Laufzeitfehler 2 (File not found) zurückgegeben. |
Ich will eine Textdatei erstellen im UTF-8 Format ohne Byte Order Mark und ohne ANSI-Codierung. Wo sehe ich das, ob das eine Datei mit BOM ist? Wenn Freebasic Dateien wirklich nur mit BOM erstellt, wie kriege es dann ohne hin?
Wie kann ich sicherstellen, dass zum Schluss eine Datei mit reinem UTF-8 vorhanden ist? Also ohne ANSI und Byte Order Mark?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 01.12.2017, 00:07 Titel: Re: Datei im UTF-8 Format ohne BOM? |
|
|
ALWIM hat Folgendes geschrieben: | Ich will eine Textdatei erstellen im UTF-8 Format ohne Byte Order Mark und ohne ANSI-Codierung. Wo sehe ich das, ob das eine Datei mit BOM ist? Wenn Freebasic Dateien wirklich nur mit BOM erstellt, wie kriege es dann ohne hin?
Wie kann ich sicherstellen, dass zum Schluss eine Datei mit reinem UTF-8 vorhanden ist? Also ohne ANSI und Byte Order Mark? | Wenn das so stimmt, wie es in der Doku steht, wovon ich eigentlich ausgehe, dann bedeutet dass, dass FreeBasic das einlesen und erstellen solcher Dateien schlicht nicht unterstützt. Was du natürlich immer machen kannst ist, die Daten im Binärmodus einzulesen bzw. zu schreiben. Du musst in diesem Fall allerdings selbst dafür sorgen, dass du die Daten im UTF-8 Format verarbeitest bzw. in dieses umwandelst. Seitens FreeBasic gibts es dazu keinerlei Unterstützung, da Unicode leider generell nur sehr eingeschränkt von FB unterstützt wird.
Ob die BOM-Bytes da sind kannst du ganz einfach mit einem Hex Editor überprüfen, indem du dir die ersten Bytes der Datei anschaust. Steht dort die entsprechende Zeichenfolge (siehe https://de.wikipedia.org/wiki/Byte_Order_Mark) dann ist ein BOM vorhanden. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 01.12.2017, 15:41 Titel: Re: Datei im UTF-8 Format ohne BOM? |
|
|
St_W hat Folgendes geschrieben: | ALWIM hat Folgendes geschrieben: | Ich will eine Textdatei erstellen im UTF-8 Format ohne Byte Order Mark und ohne ANSI-Codierung. Wo sehe ich das, ob das eine Datei mit BOM ist? Wenn Freebasic Dateien wirklich nur mit BOM erstellt, wie kriege es dann ohne hin?
Wie kann ich sicherstellen, dass zum Schluss eine Datei mit reinem UTF-8 vorhanden ist? Also ohne ANSI und Byte Order Mark? | Wenn das so stimmt, wie es in der Doku steht, wovon ich eigentlich ausgehe, dann bedeutet dass, dass FreeBasic das einlesen und erstellen solcher Dateien schlicht nicht unterstützt. Was du natürlich immer machen kannst ist, die Daten im Binärmodus einzulesen bzw. zu schreiben. Du musst in diesem Fall allerdings selbst dafür sorgen, dass du die Daten im UTF-8 Format verarbeitest bzw. in dieses umwandelst. Seitens FreeBasic gibts es dazu keinerlei Unterstützung, da Unicode leider generell nur sehr eingeschränkt von FB unterstützt wird.
Ob die BOM-Bytes da sind kannst du ganz einfach mit einem Hex Editor überprüfen, indem du dir die ersten Bytes der Datei anschaust. Steht dort die entsprechende Zeichenfolge (siehe https://de.wikipedia.org/wiki/Byte_Order_Mark) dann ist ein BOM vorhanden. |
Textdatei ist nicht ganz richtig. Es ist eher eine Datei mit der Endung .trf Diese muss im UTF-8 Format ohne BOM erstellt werden. Es darf nichts anderes sein! Das ist natürlich Mist, wenn es nicht geht. Mein ganzes Projekt droht nur wegen so einer Kleinigkeit zu scheitern... _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 107
|
Verfasst am: 01.12.2017, 16:45 Titel: |
|
|
Wenn du nur eine UTF8 Textdatei erstellen willst, kannst du die Zeichen > 127 auch selbst in UTF8 konvertieren.
(Zeichen < 128 sind bei Ansi und UTF8 gleich)
Z. B. so:
Code: |
Dim Zeile As String
Zeile = "abc--ÄÖÜ--äöü--ß--€"
Dim FF As Integer
FF = FreeFile
OPEN "file.ext" FOR outPUT AS #ff
For i = 1 to Len(Zeile)
Select Case Mid(zeile, i, 1)
case "ä" : Print #FF, CHR$(195, 164);
case "Ä" : Print #FF, CHR$(195, 132);
case "ö" : Print #FF, CHR$(195, 182);
case "Ö" : Print #FF, CHR$(195, 150);
case "ü" : Print #FF, CHR$(195, 188);
case "Ü" : Print #FF, CHR$(195, 156);
case "ß" : Print #FF, CHR$(195, 159);
case "€" : Print #FF, CHR$(226, 130, 172);
Case Else : Print #FF, Mid(zeile, i, 1)
END Select
Next
Print #FF, "" 'Zeilenumbruch
Close
|
(Die Liste kann selbstverständlich für weitere Zeichen erweitert werden).
Oder
Die Zeichen vorher 'replacen'
Oder
Mit der API-Funktion 'WideCharToMultiByte'
|
|
Nach oben |
|
|
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 107
|
Verfasst am: 01.12.2017, 16:50 Titel: |
|
|
Bei
Code: | Case Else : Print #FF, Mid(zeile, i, 1); |
Semikolon ";" am Ende! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 01.12.2017, 16:57 Titel: |
|
|
ALWIM hat Folgendes geschrieben: | Mein ganzes Projekt droht nur wegen so einer Kleinigkeit zu scheitern... | Na komm! Dafür eine Prozedur zu schreiben ist doch eine der leichtesten Übungen.
Gruß
grindstone
EDIT: Ich sehe gerade, HorstD war schneller als ich (und das auch noch mit einer passenden Lösung). _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 01.12.2017, 18:01 Titel: |
|
|
Da war doch noch was, irgendwo ganz weit in meinem Hinterstübchen...
Im FB - Paket gibt es, kaum bekannt und meines Wissens komplett undokumentiert, eine Datei namens "utf_conv.bi", die ich irgendwann doch noch zur Zusammenarbeit überreden konnte:
Code: | #Include Once "utf_conv.bi"
Dim As String text = "abc--ÄÖÜ--äöü--ß--€"
Dim As ZString*200 textUTF, textASCII
Dim As Integer numberOfBytes
'ASCII nach UTF wandeln
Print " vorher ";Len(text)
CharToUTF(UTF_ENCOD_UTF8, StrPtr(text), Len(text), @textUTF, @numberOfBytes)
Print "nachher ";numberOfBytes 'enthält die länge des UTF - strings
Print
Open ExePath + "\test.trf" For Output As #1
Print #1, textUTF
Close
'UTF nach ASCII wandeln
numberOfBytes = Len(textUTF) 'muß die länge des UTF - strings enthalten
Print " vorher ";numberOfBytes
UTFToChar(UTF_ENCOD_UTF8, @textUTF, @textASCII, @numberOfBytes)
Print "nachher ";numberOfBytes
Open ExePath + "\test2.trf" For Output As #1
Print #1, textASCII
Close
Sleep |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 01.12.2017, 22:44 Titel: |
|
|
Auch wenn ich schon deutlich zu spät bin Lengua arbeitet ebenfalls mit UTF-8 ohne BOM mithilfe von utf_conv.bi. Aktuell bastle ich dazu gerade an einem TWString-Datentyp, der mir die Umwandlung zwischen (UTF-8-)String und WSTRING PTR "automatisch" vornimmt.
http://users.freebasic-portal.de/nemored/downloads/TWString.bi
Gern nochmal drüberschauen, wie viele Speicherlecks drin sind ... _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 02.12.2017, 00:59 Titel: |
|
|
grindstone hat Folgendes geschrieben: | ALWIM hat Folgendes geschrieben: | Mein ganzes Projekt droht nur wegen so einer Kleinigkeit zu scheitern... | Na komm! Dafür eine Prozedur zu schreiben ist doch eine der leichtesten Übungen.
Gruß
grindstone
EDIT: Ich sehe gerade, HorstD war schneller als ich (und das auch noch mit einer passenden Lösung). | Das mit dem schreiben meinte ich nicht! Ich wollte das Programm bis zu einem gewissen Datum fertig haben. Das ist jetzt auf Grund der fehlenden Zeit jetzt in Gefahr!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 02.12.2017, 11:51 Titel: |
|
|
Soweit ich dich verstanden habe, geht es nur darum, das BOM aus einer existierenden Datei zu entfernen, sprich die ersten 3 Bytes:
Code: | Dim As String inhalt
Open "irgendwas.trf" For Binary As #1
inhalt = Input(Lof(1), 1) 'gesamten dateiinhalt in einen string einlesen
Close 1
If Left(inhalt, 3) = Chr(&hEF, &hBB, &hBF) Then 'auf BOM prüfen
Open "irgendwas.trf" For Output As #1
Print #1, Mid(inhalt, 4); 'string ohne die ersten 3 bytes in die datei schreiben
Close 1
EndIf |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 02.12.2017, 16:30 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Soweit ich dich verstanden habe, geht es nur darum, das BOM aus einer existierenden Datei zu entfernen, sprich die ersten 3 Bytes:
Code: | Dim As String inhalt
Open "irgendwas.trf" For Binary As #1
inhalt = Input(Lof(1), 1) 'gesamten dateiinhalt in einen string einlesen
Close 1
If Left(inhalt, 3) = Chr(&hEF, &hBB, &hBF) Then 'auf BOM prüfen
Open "irgendwas.trf" For Output As #1
Print #1, Mid(inhalt, 4); 'string ohne die ersten 3 bytes in die datei schreiben
Close 1
EndIf |
Gruß
grindstone | Eigentlich gleich so speichern, dass die gar nicht erst drin sind! Aber auf jeden Fall muss BOM weg.
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 02.12.2017, 17:22 Titel: |
|
|
Ich würde, ehrlich gesagt, die Datei über ganz normale STRING einlesen und ebenso speichern. Die Umwandlung würde ich nur speziell für die Bildschirmausgabe einsetzen - wenn du es dir nicht zu kompliziert machen willst, dann einfach über eine Text-Ersetzung, wie von HorstD vorgeschlagen. Mit der Codepage musst du dich ja sowieso rumschlagen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 02.12.2017, 21:00 Titel: |
|
|
ALWIM hat Folgendes geschrieben: | Eigentlich gleich so speichern, dass die gar nicht erst drin sind! | Dann empfehle ich eine Konvertierung mit CharToUTF -am besten mit zwei entsprechenden Functions- und -wie nemored sagt- direktem Abspeichern (und auch Lesen) der konvertierten Strings ohne ENCODING: Code: | #Include Once "utf_conv.bi"
Function UTF(s As String) As String
Dim As String sUTF
Dim As Integer numberOfBytes
sUTF = String(Len(s) * 2, " ")
CharToUTF(UTF_ENCOD_UTF8, StrPtr(s), Len(s), StrPtr(sUTF), @numberOfBytes)
Return Left(sUTF, numberOfBytes)
End Function
Function Char(s As String) As String
Dim As String sChar
Dim As Integer numberOfBytes
numberOfBytes = Len(s)
sChar = String(numberOfBytes, " ")
UTFToChar(UTF_ENCOD_UTF8, StrPtr(s), StrPtr(sChar), @numberOfBytes)
Return Left(sChar, numberOfBytes)
End Function
|
@nemored:
Hast du eine Ahnung, wofür die utf_conv.bi eigentlich gedacht war? Mit den Alias - Namen und dem Extern "C" sieht sie aus wie die Headerdatei für eine Bibliothek. Ich habe da aber nichts entsprechendes finden können. Vielleicht ein unvollendetes Projekt?
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 02.12.2017, 22:14 Titel: |
|
|
Zitat: | @nemored:
Hast du eine Ahnung, wofür die utf_conv.bi eigentlich gedacht war? Mit den Alias - Namen und dem Extern "C" sieht sie aus wie die Headerdatei für eine Bibliothek. Ich habe da aber nichts entsprechendes finden können. Vielleicht ein unvollendetes Projekt? |
Jedenfalls taucht die Datei im Repository bereits spätestens 2006 auf.
https://sourceforge.net/p/fbc/code/ci/e95c2959a3450566c112abab79249c78f5c9280e/
Als unvollendetes Projekt würde ich es nicht bezeichnen, immerhin funktioniert es wohl sehr gut. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 03.12.2017, 00:14 Titel: |
|
|
nemored hat Folgendes geschrieben: | Zitat: | @nemored:
Hast du eine Ahnung, wofür die utf_conv.bi eigentlich gedacht war? Mit den Alias - Namen und dem Extern "C" sieht sie aus wie die Headerdatei für eine Bibliothek. Ich habe da aber nichts entsprechendes finden können. Vielleicht ein unvollendetes Projekt? |
Jedenfalls taucht die Datei im Repository bereits spätestens 2006 auf.
https://sourceforge.net/p/fbc/code/ci/e95c2959a3450566c112abab79249c78f5c9280e/
Als unvollendetes Projekt würde ich es nicht bezeichnen, immerhin funktioniert es wohl sehr gut. |
Die Funktionen, die in der utf_conv.bi deklariert sind, sind in FreeBasics Laufzeit-Bibliothek (rtlib) implementiert und werden von dieser auch intern verwendet. Also nix mit unvollendet, verwaist oder ähnliches _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 03.12.2017, 11:56 Titel: |
|
|
Danke für die Hinweise. Ich war nur etwas verwirrt wegen der Aliasnamen, die außerhalb der utf_conv.bi nirgendwo im FB - Installationspaket auftauchen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 10.12.2017, 17:44 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Da war doch noch was, irgendwo ganz weit in meinem Hinterstübchen...
Im FB - Paket gibt es, kaum bekannt und meines Wissens komplett undokumentiert, eine Datei namens "utf_conv.bi", die ich irgendwann doch noch zur Zusammenarbeit überreden konnte:
Code: | #Include Once "utf_conv.bi"
Dim As String text = "abc--ÄÖÜ--äöü--ß--€"
Dim As ZString*200 textUTF, textASCII
Dim As Integer numberOfBytes
'ASCII nach UTF wandeln
Print " vorher ";Len(text)
CharToUTF(UTF_ENCOD_UTF8, StrPtr(text), Len(text), @textUTF, @numberOfBytes)
Print "nachher ";numberOfBytes 'enthält die länge des UTF - strings
Print
Open ExePath + "\test.trf" For Output As #1
Print #1, textUTF
Close
'UTF nach ASCII wandeln
numberOfBytes = Len(textUTF) 'muß die länge des UTF - strings enthalten
Print " vorher ";numberOfBytes
UTFToChar(UTF_ENCOD_UTF8, @textUTF, @textASCII, @numberOfBytes)
Print "nachher ";numberOfBytes
Open ExePath + "\test2.trf" For Output As #1
Print #1, textASCII
Close
Sleep |
Gruß
grindstone |
Jetzt bin ich doch ein wenig verwirrt? Mit Encoding habe ich immer dieses BOM, was ich nicht haben will.
Da könnte ich doch ja gleich so speichern:
Code: | Open ExePath + "\test.trf" For Output As #1
Print #1, text
Close | Oder verstehe ich da was falsch? Auf der anderen Seite muss ich sagen, dass es ohne ANSI und ohne BOM sein muss! Ich muss ja nur schauen, dass ich ohne ANSI und ohne BOM abspeichere. Was habe ich eigentlich, wenn ich so wie oben ganz normal abspeichere?
Bei den ASC Zeichencodes verwende ich nur Codes über 31 und unter 127 + die Codes 27, 13, 8, 129, 132, 142, 148, 153, 154, 225
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1215 Wohnort: Ruhrpott
|
Verfasst am: 10.12.2017, 18:26 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Dann empfehle ich eine Konvertierung mit CharToUTF -am besten mit zwei entsprechenden Functions- und -wie nemored sagt- direktem Abspeichern (und auch Lesen) der konvertierten Strings ohne ENCODING: | Und ANSI hast du ganz automatisch nicht, da FB standardmäßig mit ASCII - Code arbeitet. ANSI brauchst du nur zur korrekten Darstellung von (deutschen) Sonderzeichen (Umlauten etc.) im DOS - Fenster.
Bis Chr(127) sind ASCII und UTF8 übrigens identisch.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 107
|
Verfasst am: 10.12.2017, 19:45 Titel: |
|
|
Zitat: | OBei den ASC Zeichencodes verwende ich nur Codes über 31 und unter 127 + die Codes 27, 13, 8, 129, 132, 142, 148, 153, 154, 225 |
Wie wird dein Text erstellt?
Im Konsolenfenster oder im Editor? |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1041 Wohnort: Niederbayern
|
Verfasst am: 10.12.2017, 19:49 Titel: |
|
|
HorstD hat Folgendes geschrieben: | Zitat: | OBei den ASC Zeichencodes verwende ich nur Codes über 31 und unter 127 + die Codes 27, 13, 8, 129, 132, 142, 148, 153, 154, 225 |
Wie wird dein Text erstellt?
Im Konsolenfenster oder im Editor? | Durch mein selbstgeschriebenes Programm! Ich öffne die EXE-Datei und gebe dann mittels einer Input-Routine den Text ein. Anschließend soll er in einer Datei abgespeichert werden können. Als UTF-8 ohne BOM und ohne ANSI.
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
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.
|
|