Zoff mit ANSI und Unicode
Zoff mit ANSI und Unicode
Hi,
ich habe gerade das Problem, dass bei einem WideString immer ein ätzendes Sonderzeichen davorsteht. Ich möchte beim Laden einer M3U prüfen, ob diese eine erweiterte (erkennt man an einem #EXTM3U) oder eine simple ist. Problem: Durch das Sonderzeichen von Unicode kann die If, die genau dies prüft, niemals True zurückgeben. Bei diesem Problem komme ich nicht drumherum, euch ein Beispielprojekt zu zeigen. Es ist ausführlich kommentiert, auch der Programmabschnitt der momentan wegen der "Deuer-False-If" nicht erreicht werden kann. Eine Sache muss ich trotzdem noch erklären: Die test.m3u beinhaltet ausschließlich ANSI und ist eine simple M3U. Sie enhält ausschließlich Dateinamen. Die testu.m3u ist eine erweiterte M3U und eine Unicode-Datei.
Also kurz gesagt: Wodurch entsteht das Sonderzeichen und wie kann man es vermeiden ? Abgesehen davon muss die Ausgabe auch in Unicode erfolgen. Wie könnte man das gut lösen ?
ich habe gerade das Problem, dass bei einem WideString immer ein ätzendes Sonderzeichen davorsteht. Ich möchte beim Laden einer M3U prüfen, ob diese eine erweiterte (erkennt man an einem #EXTM3U) oder eine simple ist. Problem: Durch das Sonderzeichen von Unicode kann die If, die genau dies prüft, niemals True zurückgeben. Bei diesem Problem komme ich nicht drumherum, euch ein Beispielprojekt zu zeigen. Es ist ausführlich kommentiert, auch der Programmabschnitt der momentan wegen der "Deuer-False-If" nicht erreicht werden kann. Eine Sache muss ich trotzdem noch erklären: Die test.m3u beinhaltet ausschließlich ANSI und ist eine simple M3U. Sie enhält ausschließlich Dateinamen. Die testu.m3u ist eine erweiterte M3U und eine Unicode-Datei.
Also kurz gesagt: Wodurch entsteht das Sonderzeichen und wie kann man es vermeiden ? Abgesehen davon muss die Ausgabe auch in Unicode erfolgen. Wie könnte man das gut lösen ?
- Dateianhänge
-
M3U.zip
- (63.05 KiB) 67-mal heruntergeladen
Meine Musik: spiker-music.net
-
- Beiträge: 1103
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Zoff mit ANSI und Unicode
Wahrscheinlich ein BOM Zeichen (FEFF oder FFEF), es setzt die Endianess von dem EncodingNils hat geschrieben:Hi,
ich habe gerade das Problem, dass bei einem WideString immer ein ätzendes Sonderzeichen davorsteht. Ich möchte beim Laden einer M3U prüfen, ob diese eine erweiterte (erkennt man an einem #EXTM3U) oder eine simple ist. Problem: Durch das Sonderzeichen von Unicode kann die If, die genau dies prüft, niemals True zurückgeben. Bei diesem Problem komme ich nicht drumherum, euch ein Beispielprojekt zu zeigen. Es ist ausführlich kommentiert, auch der Programmabschnitt der momentan wegen der "Deuer-False-If" nicht erreicht werden kann. Eine Sache muss ich trotzdem noch erklären: Die test.m3u beinhaltet ausschließlich ANSI und ist eine simple M3U. Sie enhält ausschließlich Dateinamen. Die testu.m3u ist eine erweiterte M3U und eine Unicode-Datei.
Also kurz gesagt: Wodurch entsteht das Sonderzeichen und wie kann man es vermeiden ?
BOMs sind eine normale Teil Unicode, aber für nich Architektur abhängige Dateien nicht so wichtig. Einfach lesen aber ignorieren.Abgesehen davon muss die Ausgabe auch in Unicode erfolgen. Wie könnte man das gut lösen ?
Re: Zoff mit ANSI und Unicode
Hm, nur wie könnte man das in meinem Code überhaupt umgehen ? Ich weiß ja nicht mal wie das Zeichen aussieht geschwigedenn, dass es immer auftaucht.
Meine Musik: spiker-music.net
-
- Beiträge: 1103
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Zoff mit ANSI und Unicode
Ich denke das Writeln mit Widestring umgehen kann, aber vielleicht Unit CRT nicht.
Wenn es ein unterschied zwischen write() und writeln() gebe, konnte das durch unterschiedliches write-nach-OS geschehen.
Wenn es ein unterschied zwischen write() und writeln() gebe, konnte das durch unterschiedliches write-nach-OS geschehen.
Re: Zoff mit ANSI und Unicode
Das ist ein UTF-8 BOM : EF BB BFNils hat geschrieben:Hm, nur wie könnte man das in meinem Code überhaupt umgehen ? Ich weiß ja nicht mal wie das Zeichen aussieht geschwigedenn, dass es immer auftaucht.
Einfach die drei Bytes überspringen.
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Zoff mit ANSI und Unicode
Bei mir unter Linux habe ich mit Umlauten Probleme wenn ich Write bzw. writeln nutze.
Die werden nicht richtig angezeigt.Allerdings hat ShowMessage damit keine Probleme.
Könnte man es nicht Prüfen ? z.b. so:
if (str '') and (str[1] 'Das Zeichen' then
oder so.
Wobei ich meine auch das Trim solche Zeichen löschen sollte. Oder gehört das nicht zu den Steuer Zeichen ?
Die werden nicht richtig angezeigt.Allerdings hat ShowMessage damit keine Probleme.
Könnte man es nicht Prüfen ? z.b. so:
if (str '') and (str[1] 'Das Zeichen' then
oder so.
Wobei ich meine auch das Trim solche Zeichen löschen sollte. Oder gehört das nicht zu den Steuer Zeichen ?
MFG
Michael Springwald
Michael Springwald
Re: Zoff mit ANSI und Unicode
Existiert diese UTF8 BOM immer ? Also kann ich grundsätzlich davon ausgehen, dass er existiert ? Denn es könnte ja auch eine ANSI-Datei geladen werden.
Meine Musik: spiker-music.net
Re: Zoff mit ANSI und Unicode
Nein. Wenn's da ist, ist's da und dann ist es UTF8, es kann aber auch sonst ne UTF8 Datei sein.Nils hat geschrieben:Existiert diese UTF8 BOM immer ? Also kann ich grundsätzlich davon ausgehen, dass er existiert ? Denn es könnte ja auch eine ANSI-Datei geladen werden.
Es kann auch eine andere BOM geben:
Kodierung Bytefolge
UTF-8 EF BB BF
UTF-16 Big Endian FE FF
UTF-16 Little Endian FF FE
UTF-32 Big Endian 00 00 FE FF
UTF-32 Little Endian FF FE 00 00
Re: Zoff mit ANSI und Unicode
Ahja. Und welche Methode wäre am geschicktesten um schnell zu prüfen, ob eine Playlist Unicode ist oder nicht ? Sagen wir es mal so: Gibt es UTF16 oder 32 Playlisten ? Dieser BOM ist also ein Kennzeichen für den Zeichensatz welches direkt am Anfang der Datei steht und kann auch so geprüft werden ?
Meine Musik: spiker-music.net
Re: Zoff mit ANSI und Unicode
Die ersten max. 4 Bytes auslesen und schauen, ob die einem der obigen BOM's entsprechen.Nils hat geschrieben:Ahja. Und welche Methode wäre am geschicktesten um schnell zu prüfen, ob eine Playlist Unicode ist oder nicht ?
k.A. bei Playlisten. Grundsätzlich können Textdateien einen BOM haben.Nils hat geschrieben: Sagen wir es mal so: Gibt es UTF16 oder 32 Playlisten ?
Ja.Nils hat geschrieben: Dieser BOM ist also ein Kennzeichen für den Zeichensatz welches direkt am Anfang der Datei steht und kann auch so geprüft werden ?
Re: Zoff mit ANSI und Unicode
Dann schaff ich das jetzt denke ich. Danke für Eure Hilfe! 

Meine Musik: spiker-music.net
Re: Zoff mit ANSI und Unicode
Ich habe nochmal eine Frage.
Wie lese ich eine UTF16- oder UTF32-Playlist ein (falls es sie überhaupt gibt) ? Es gibt ja gar kein AnsiToUTF16 oder AnsiToUTF32. Dies ist ein Code von vor über 5 Jahren. Ist der noch hilfreich um UTF16 zu laden oder geht es mittlerweile schon besser ? Wie steht es dann mit UTF32 ? Klick!
Das Laden der UTF8 funktioniert mittlerweile besser, aber ich weiß nicht ob das Ergebnis korrekt ist. Dies steht in der Playlist:
Wie lese ich eine UTF16- oder UTF32-Playlist ein (falls es sie überhaupt gibt) ? Es gibt ja gar kein AnsiToUTF16 oder AnsiToUTF32. Dies ist ein Code von vor über 5 Jahren. Ist der noch hilfreich um UTF16 zu laden oder geht es mittlerweile schon besser ? Wie steht es dann mit UTF32 ? Klick!
Das Laden der UTF8 funktioniert mittlerweile besser, aber ich weiß nicht ob das Ergebnis korrekt ist. Dies steht in der Playlist:
Der Titel wird ausgelesen und mit AnsiToUTF8 konvertiert. Als Ergebnis erhalte ich lauter seltsame Zeichen. Wenn ich diese Zeichen kopiere und hier einfüge steht hier wieder 冨田勲 – Boléro. Ist das so ok ? Ich habe mit Unicode bisher nicht allzu viel zu tun gehabt (meine Playlisten haben alle nur Liednamen ohne Sonderzeichen drinnen) und muss das eben einfach einbauen, weil es dazu gehört.test.m3u hat geschrieben:#EXTINF:264,冨田勲 – Boléro
C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Musik\Titel irgendeinenummer.mp3
Zuletzt geändert von Nils am So 5. Okt 2008, 12:27, insgesamt 1-mal geändert.
Meine Musik: spiker-music.net
-
- Beiträge: 1103
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Zoff mit ANSI und Unicode
Widestrings sind utf-16, also mit widestrings laden moechte helfen, und dann nach ansistrings convertieren. Vielleicht existiert etwas wie widetoutf8 ?Nils hat geschrieben:Ich habe nochmal eine Frage.
Wie lese ich eine UTF16- oder UTF32-Playlist ein (falls es sie überhaupt gibt) ? Es gibt ja gar kein AnsiToUTF16 oder AnsiToUTF32. Dies ist ein Code von vor über 5 Jahren. Ist der noch hilfreich um UTF16 zu laden oder geht es mittlerweile schon besser ?
UTF-32 werdet typisch nur intern genutzt, um complexe String routinen mit ein "codepoint" per array item zu bearbeiten. Ich wuerde micht die Muehe nicht geben.Wie steht es dann mit UTF32 ? Klick!
Re: Zoff mit ANSI und Unicode
Ich verwende die alte Laderoutine AssignFile, Reset und ReadLn. ReadLn kann leider nur in AnsiStrings laden. Hast du einen Vorschlag, wie man das dann ordentlich in einen WideString bekommt ? Wenn WideString=UTF16, was ist dann UTF8 ? In welchen Datentyp muss UTF8 geladen werden ?
Meine Musik: spiker-music.net
Re: Zoff mit ANSI und Unicode
UTF-8 kann in einen ANSIString geladen werden. Mit UTF8Decode wird ein WideString daraus.Nils hat geschrieben:In welchen Datentyp muss UTF8 geladen werden ?