Zoff mit ANSI und Unicode

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Zoff mit ANSI und Unicode

Beitrag von Nils »

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 ?
Dateianhänge
M3U.zip
(63.05 KiB) 67-mal heruntergeladen
Meine Musik: spiker-music.net

marcov
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

Beitrag von marcov »

Nils 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 ?
Wahrscheinlich ein BOM Zeichen (FEFF oder FFEF), es setzt die Endianess von dem Encoding
Abgesehen davon muss die Ausgabe auch in Unicode erfolgen. Wie könnte man das gut lösen ?
BOMs sind eine normale Teil Unicode, aber für nich Architektur abhängige Dateien nicht so wichtig. Einfach lesen aber ignorieren.

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Re: Zoff mit ANSI und Unicode

Beitrag von Nils »

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

marcov
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

Beitrag von marcov »

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.

Benutzeravatar
theo
Beiträge: 10949
Registriert: Mo 11. Sep 2006, 19:01

Re: Zoff mit ANSI und Unicode

Beitrag von theo »

Nils 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.
Das ist ein UTF-8 BOM : EF BB BF
Einfach die drei Bytes überspringen.

pluto
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

Beitrag von pluto »

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 ?
MFG
Michael Springwald

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Re: Zoff mit ANSI und Unicode

Beitrag von Nils »

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

Benutzeravatar
theo
Beiträge: 10949
Registriert: Mo 11. Sep 2006, 19:01

Re: Zoff mit ANSI und Unicode

Beitrag von theo »

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.
Nein. Wenn's da ist, ist's da und dann ist es UTF8, es kann aber auch sonst ne UTF8 Datei sein.
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

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Re: Zoff mit ANSI und Unicode

Beitrag von Nils »

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

Benutzeravatar
theo
Beiträge: 10949
Registriert: Mo 11. Sep 2006, 19:01

Re: Zoff mit ANSI und Unicode

Beitrag von theo »

Nils hat geschrieben:Ahja. Und welche Methode wäre am geschicktesten um schnell zu prüfen, ob eine Playlist Unicode ist oder nicht ?
Die ersten max. 4 Bytes auslesen und schauen, ob die einem der obigen BOM's entsprechen.
Nils hat geschrieben: Sagen wir es mal so: Gibt es UTF16 oder 32 Playlisten ?
k.A. bei Playlisten. Grundsätzlich können Textdateien einen BOM haben.
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 ?
Ja.

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Re: Zoff mit ANSI und Unicode

Beitrag von Nils »

Dann schaff ich das jetzt denke ich. Danke für Eure Hilfe! :)
Meine Musik: spiker-music.net

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Re: Zoff mit ANSI und Unicode

Beitrag von Nils »

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:
test.m3u hat geschrieben:#EXTINF:264,冨田勲 – Boléro
C:\Dokumente und Einstellungen\All Users\Dokumente\Eigene Musik\Titel irgendeinenummer.mp3
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.
Zuletzt geändert von Nils am So 5. Okt 2008, 12:27, insgesamt 1-mal geändert.
Meine Musik: spiker-music.net

marcov
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

Beitrag von marcov »

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 ?
Widestrings sind utf-16, also mit widestrings laden moechte helfen, und dann nach ansistrings convertieren. Vielleicht existiert etwas wie widetoutf8 ?
Wie steht es dann mit UTF32 ? Klick!
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.

Nils
Beiträge: 130
Registriert: Mo 28. Mai 2007, 12:36
Kontaktdaten:

Re: Zoff mit ANSI und Unicode

Beitrag von Nils »

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

Benutzeravatar
theo
Beiträge: 10949
Registriert: Mo 11. Sep 2006, 19:01

Re: Zoff mit ANSI und Unicode

Beitrag von theo »

Nils hat geschrieben:In welchen Datentyp muss UTF8 geladen werden ?
UTF-8 kann in einen ANSIString geladen werden. Mit UTF8Decode wird ein WideString daraus.

Antworten