Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 29.07.06 09:57 
Ich habe eine Datei, sagen wir mal mit dem melodisch klingenden Namen מופע הארנבות של ד''ר קספר - השיר שלי.mp3 (ich hoffe, das wird überall vernünftig angezeigt, es sind hebräische Schriftzeichen). In dieser Datei möchte ich einen String auslesen, der laut ID3-v2-Tag-Spezifikation mit dem Zeichensatz ISO-8859-1 (Latin-1, Westeuropäisch) kodiert sein sollte. Nun ist es aufgrund des Dateinamens relativ offensichtlich, dass der verwendete Zeichensatz ISO-8859-8 (Hebräisch) ist (der Dateiname stimmt dann teilweise mit der Info unter "Titel" überein ;-)).

Für so einen "Unsinn" ist im ID3v2-Tag eigentlich Unicode da, damit die Meta-Informationen auf jedem System vernünftig angezeigt werden können (dafür wird im Tag ein entsprechendes Flag umgesetzt). Scheinbar wird in der Regel aber das "es sollte Latin-1 sein" (wenn der Flag "0" ist) sehr oft als "was anderes ist auch wurscht" interpretiert, und einfach ein anderer 8Bit-Zeichensatz verwendet. Kann man machen, macht aber eine vernünftige Verarbeitung der Informationen sehr schwer, wenn man eine multikulturelle Playlist hat.

Ich möchte nun gerne meine mp3FileUtils komplett Unicode-fähig machen, sodass auch "fremde" Schriften auf Wunsch ausgelesen und angezeigt werden können. Bisher wird Unicode nach Ansi konvertiert - wobei Informationen verloren gehen können.
Es ist natürlich unschön, wenn das theoretisch mögliche Auslesen von 16Bit-Unicode-Textinformation gar nichts bringt, weil oft nur 8-Bit Zeichen in variablen Zeichensätzen verwendet werden, und beim Auslesen des ID3-Tags bei hebräischen oder russischen Stücken nur Quatsch angezeigt wird, weil meine Unit fälschlicherweise davon ausgeht, dass der Standard eingehalten wird. :roll:, in Wahrheit aber ein anderer Zeichensatz verwendet wird.

Ich suche also eine Möglichkeit, eine Bytefolge in einen WideString zu konvertieren, und dabei als Parameter den zugrundeliegenden Zeichensatz angeben zu können. Dabei wäre es außerdem sehr sinnig, wenn der "wahrscheinlich verwendete Zeichensatz" automatisch aus dem Dateinamen (bzw. aus den dort verwendeten Unicode-Zeichen) ermittelt werden könnte.

Hat da jemand Ansatzpunkte, Funktionen, Units?

_________________
We are, we were and will not be.
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Sa 29.07.06 10:56 
www.zeitungsjunge.de/delphi/converters/

user profile iconGausi hat folgendes geschrieben:
Dabei wäre es außerdem sehr sinnig, wenn der "wahrscheinlich verwendete Zeichensatz" automatisch aus dem Dateinamen (bzw. aus den dort verwendeten Unicode-Zeichen) ermittelt werden könnte.
Das dürfte unmöglich sein, es sei denn du schreibst es dir selbst indem du den OEM-String nach Unicode konvertierst und vergleichst, und das für jedes mögliche Encoding.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Sa 29.07.06 11:34 
Hallo gausi,

da musst du mal in die System.pas gucken, da sind eine ganze Menge konvertierungen drin, z.B.: UnicodeToUtf8, WideStringToUCS4String etc. (in der Art findest du noch ne ganze Menge ;)).

Also musste mal schaun, ob deine dabei ist (vlzt. unter einer anderen Bezeichnung). Mach dir aber keine große Hoffnungen :P.
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 29.07.06 14:48 
@tommie-lie: Das sieht auf den ersten Blick ganz gut aus.

Mit der automatischen Erkennung: Die Bereiche #A0- #FF in den verschiedenen ISO-8859-Teilnormen (also die, die nicht überall gleich sind), scheinen relativ zusammenhängende Bereiche im Unicode-Wertebereich zu haben. Wenn ich also durchgehe, was für Unicode-Zeichen im Dateinamen vorhanden sind, dann sollte ich doch relativ einfach auf den Zeichensatz schließen können, der "wahrscheinlich" im Tag verwendet wird, oder?

_________________
We are, we were and will not be.
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Sa 29.07.06 15:03 
user profile iconGausi hat folgendes geschrieben:
Das sieht auf den ersten Blick ganz gut aus.
Echt? War nur ein schnelles Google-Ergebnis, aber libiconv stimmte mich positiv.

user profile iconGausi hat folgendes geschrieben:
Die Bereiche #A0- #FF in den verschiedenen ISO-8859-Teilnormen (also die, die nicht überall gleich sind), scheinen relativ zusammenhängende Bereiche im Unicode-Wertebereich zu haben.
Als Printable Characters eines gewissen Alphabets oder einer gewissen Schrift haben die das so an sich ;-)

Gausi hat folgendes geschrieben:
Wenn ich also durchgehe, was für Unicode-Zeichen im Dateinamen vorhanden sind, dann sollte ich doch relativ einfach auf den Zeichensatz schließen können, der "wahrscheinlich" im Tag verwendet wird, oder?
Das meinte ich mit
user profile icontommie-lie hat folgendes geschrieben:
indem du den OEM-String nach Unicode konvertierst und vergleichst, und das für jedes mögliche Encoding.
Du weißt durch den Dateinamen zwar, in welchem Unicode-Bereich sich die gesuchten Zeichen wahrscheinlich befinden, aber du musst immer noch ein passendes ISO-Encoding finden, daß die Zeichen aus den Tags "zufällig" in den wahrscheinlichen Unicode-Bereich mappt. Du musst also für jedes Encoding wissen, in welchem Unicode-Bereich der fragwürdige String landen wird.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 29.07.06 15:43 
user profile icontommie-lie hat folgendes geschrieben:
Du musst also für jedes Encoding wissen, in welchem Unicode-Bereich der fragwürdige String landen wird.

Dabei sollten mir diese Dokumente helfen, die ich über Wikipedia gefunden habe, oder? 8)

Vorausgesetzt mal, ich beschränke mich auf diese Zeichensatz-Kodierungen.

_________________
We are, we were and will not be.
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Sa 29.07.06 15:47 
user profile iconGausi hat folgendes geschrieben:
Dabei sollten mir diese Dokumente helfen, die ich über Wikipedia gefunden habe, oder? 8)
Jupp. ;-)

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert