Unicode im Lister

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
Juergen
Power Member
Power Member
Posts: 517
Joined: 2003-05-02, 18:19 UTC
Location: Berlin (Germany)
Contact:

Unicode im Lister

Post by *Juergen »

Hallo zusammen!

Die Funktionsweise des internen Listers (des aktuellen TC 6.54a) ist mir teilweise unklar. Z.B. habe ich mit PSPad 4.3.3 eine Textdatei erzeugt, und diese im Format UTF-8 gespeichert. Wenn ich diese Datei im internen Lister ansehe und auf "Optionen" klicke, sehe ich ein Häkchen vor den Menüeinträgen "UTF-8" und vor "ANSI-Zeichensatz". Wie kann ein Text zugleich beide Formate haben?
Im Gegensatz zum Lister ist bei PSPad kein Trennstrich zwischen den Menüeinträgen "UTF-8" und "ANSI", d.h. sie befinden sich dort beide in derselben Kategorie, und es kann eben nur ein Eintrag dieser Kategorie ausgewählt sein. Dies ist nach meinem Verständnis die logische und korrekte Darstellungsweise.

Ein anderer Punkt ist, dass die Darstellungsweise im Lister wie auch in PSPad suggeriert, ein Text habe entweder das Format "Unicode" oder das Format "UTF-8". Aber soweit ich es verstanden habe, ist "Unicode" doch der Oberbegriff, der "UTF-8" sowie weitere Formate umfasst:

Code: Select all

Die Speicherung und Übertragung von Unicode erfolgt in unterschiedlichen Formaten:
- UTF-8
- UTF-16
- SCSU
- UTF-EBCDIC
...
Quelle: http://de.wikipedia.org/wiki/Unicode

D.h. ein eigentliches Format "Unicode" gibt es gar nicht, oder wie? Wofür steht dann der Menüeintrag "Unicode" im Lister?

Und woher weiß ich eigentlich, welches Format eine gegebene Textdatei "wirklich" hat. D.h. gibt es ein allgemein anerkanntes Referenzprogramm zur Ermittlung des Formates?

Danke im Voraus für hilfreiche Erleuchtungen. :)

Gruß, Jürgen
My add-ons and plugins for TC: NiftyLink, mbox, Sequences
User avatar
Lefteous
Power Member
Power Member
Posts: 9537
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

2Juergen
ein eigentliches Format "Unicode" gibt es gar nicht, oder wie?
Ich denke es ist so: Erst ist Unicode entstanden. Später kamen dann UTF-8, UTF-32 und andere hinzu. Um das unterscheiden zu können hat man Unicode dann als UTF-16 bezeichnet.

p.s.: Hast Du schon mal eine Datei im Windows Editor abgespeichert? Da gibt es auch Unicode und UTF-8 :-)
Juergen
Power Member
Power Member
Posts: 517
Joined: 2003-05-02, 18:19 UTC
Location: Berlin (Germany)
Contact:

Post by *Juergen »

2Lefteous
Ich denke es ist so: Erst ist Unicode entstanden. Später kamen dann UTF-8, UTF-32 und andere hinzu. Um das unterscheiden zu können hat man Unicode dann als UTF-16 bezeichnet.
Ach so. Ich wußte nicht, dass "Unicode" außer als Oberbegriff teilweise auch als Synonym für "UTF-16" verwendet wird. Danke für die Erklärung!
p.s.: Hast Du schon mal eine Datei im Windows Editor abgespeichert? Da gibt es auch Unicode und UTF-8 :-)
OK, das ist ja auch angesichts der historischen Enwicklung wie Du sie geschildert hast verständlich. Aber wäre es angesichts des heutigen Entwicklungsstandes nicht angemessener und präziser, stattdessen den Begriff "UTF-16" zu verwenden -- z.B. im Lister des TC 7.0? Um in der Unicode-Geschichte wenig bewanderte Leute wie mich nicht unnötig zu verwirren? :)

Gruß, Jürgen
My add-ons and plugins for TC: NiftyLink, mbox, Sequences
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Re: Unicode im Lister

Post by *Sheepdog »

Juergen wrote:Wie kann ein Text zugleich beide Formate haben?
Ohne jetzt die Formate voll im Griff zu haben, kann ich Dir folgendes dazu sagen:

UTF-8, Unicode, Nur Text - sind jeweils Formate, wie der Text und bestimmte Sonderzeichen abgelegt werden. Unter DOS wurde ein ASCII-Zeichen in einem Byte codiert. Mit Unicode wurde der Zeichnesatz erheblich erweitert, so dass die 256 in einem Byte möglcihen Zeichen nicht mehr ausreichen. Daher werden für jedes Zeichen 2 Byte benutzt (65535 mögliche Zeichen). Nun muss ich aber wissen, ob in einem Text der Buchstabe "A" durch den Wert 65 = Bin 1000 0001 repräsentiert wird oder durch 0065= Bin 0000 0000 1000 0001. Und wenn ich das richtig sehe, werden bei UTF-8 die Sonderzeichen speziell dargestellt, und zwar folgt nach einem bestimmten Steuerzeichen das Sonderzeichen in 2 Byte codiert, so dass normale Zeichen ein Byte lang sind, Sonderzeichen aber 3 Byte.

Wenn man einen gewöhnlichen Text ansieht, der zum Beispiel ä,ö oder ü enthält und diesen dann als UTF-( anzeigen lässt, so werden diese ä,ö und ü in ein nicht darstellbares Sonderzeichen umgewandelt, und die jeweils beiden nachfolgenden Buchstaben werden verschluckt.

ASCII/ANSI sind lediglich zwei verschieden Interpretationen der einzelnen Zeichen.

Da in den einzelnen Sprachen unterschiedliche Zeichen benutzt werden, gibt es für jede Sprache eine sogenannte Codeseite, in der die Zuordnung der 256 Zeichencodes zu den tatsächliche benutzen Zeichen festgelegt ist. Prominentestes Beispiel dafür ist der Tastaturtreiber, der geladen wird, wenn man den PC bootet und ins BIOS möchte. Da sind dann nämlich bekannterweise z mit y vertauscht, und man findet weder "" noch ""/" und der Doppelpunkt erscheint wenn man "ö" drückt.

Unter Windows wird nun gern ANSI benutz, was aber mit dem DOS Zeichensatz nicht übereinstimmt. Wie man jetzt zu ANSI kam übersteigt meine geschichtlichen Kenntnisse. ;) Aber auf jeden Fall werden hier die Ös und Üs anders dargestellt als unter ASCII.

Somit liest der Lister erst mal den Text ein und interpretiert die Zeichen als 1, 2 oder 1/3 Byte pro Zeichen und wenn er damit fertig ist, wird jedem Zeichencode ein Zeichen aus dem entsprechenden Zeichensatz zugeordnet.

Der Lister versucht automatisch herauszufinden, um was für einen Text es sich handelt, kann dies aber nicht immer feststellen. Wenn man deshalb einen Text nixht richtig lesen kann, darf man einfach manuell mal die Codierung umstellen. Wenn man dann eine lesbare Darstellung bekommt, hat man gewonnen.

Man kann übrigens im Lister unter Konfigurieren auch noch für ANSI und ASCII unterschiedlich Fonts einstellen.


Code: Select all

Die Speicherung und Übertragung von Unicode erfolgt in unterschiedlichen Formaten:
- UTF-8
- UTF-16
- SCSU
- UTF-EBCDIC
...
Quelle: http://de.wikipedia.org/wiki/Unicode


D.h. ein eigentliches Format "Unicode" gibt es gar nicht, oder wie? Wofür steht dann der Menüeintrag "Unicode" im Lister?
Doch, natürlich gibt es ein eigentliches Unicode-Format. Aber wenn ich einen deustchen oder englischen Text schreibe und den im Unicode Format speichere, dann besteht der zu beinahe 50% aus Nullen. Also ein Text mit 1000 Zeichen ist 2000 Bytes lang. Darin sind 10 Sonderzeichen (äöü) enthalten, der Rest ist Standard und ließe sich mit ASCII darstellen. Also beutze ich den oben geschilderten Trick und codiere die 10 Sonderzeichen mit jeweils 3 Byte (=30 Byte) und den Rest als ASCII mit 1 Byte (990). Somit habe ich den gleichen Text in 1020 Bytes gespeichert.

Und die Herren Ebdic und SCSU habe sich da halt einen anderen Trick ausgedacht (UTF -16 ist, glaube ich die Speicherung mit allen Nullen).
Und woher weiß ich eigentlich, welches Format eine gegebene Textdatei "wirklich" hat. D.h. gibt es ein allgemein anerkanntes Referenzprogramm zur Ermittlung des Formates?
Eigentlich musst Du Dir das vom Ersteller des Textes sagen lassen. Und wenn DU Dich mit den Formaten beschäftigt hast, dann aknnst Du das auch nach Analyes des Textes herausbekommen (wenn der Urheber sich an die Standards gehalten hat). Aber wie gesagt, sieh Dir einen TExt im Lister an und schlate die entsprechenden Optionen ein oder aus. Es wird Dir in der Regel nur eine Einstellung einen Komplett lesbaren TExt liefern.

sheepdog

Gruß, Jürgen[/quote]k
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Juergen
Power Member
Power Member
Posts: 517
Joined: 2003-05-02, 18:19 UTC
Location: Berlin (Germany)
Contact:

Post by *Juergen »

2Sheepdog:
Und wenn ich das richtig sehe, werden bei UTF-8 die Sonderzeichen speziell dargestellt, und zwar folgt nach einem bestimmten Steuerzeichen das Sonderzeichen in 2 Byte codiert, so dass normale Zeichen ein Byte lang sind, Sonderzeichen aber 3 Byte.
...
ASCII/ANSI sind lediglich zwei verschieden Interpretationen der einzelnen Zeichen.
Genau so verstehe ich das auch. Danach stellt es sich aber für mich so dar, dass ein Text entweder das Format UTF-8 hat, oder ASCII/ANSI. Anders ausgedrückt: Wenn ein best. Zeichen durch einen best. Wert im UTF-8-Format codiert ist, was gibt es dann da noch zu interpretieren? Das ist ja gerade der Sinn von UTF-8 (und anderen Unicode-Formaten), dass Interpretationen eben nicht mehr erforderlich sind.
Doch, natürlich gibt es ein eigentliches Unicode-Format.
Teilst du denn Lefteus' Auffassung, dass damit das selbe wie mit "UTF-16" gemeint ist, oder bist du anderer Anicht? (Es geht mir um die präzise Definition, nicht darum wieviel Nullen dabei erzeugt werden.)
Und wenn DU Dich mit den Formaten beschäftigt hast, dann aknnst Du das auch nach Analyes des Textes herausbekommen (wenn der Urheber sich an die Standards gehalten hat). Aber wie gesagt, sieh Dir einen TExt im Lister an und schlate die entsprechenden Optionen ein oder aus. Es wird Dir in der Regel nur eine Einstellung einen Komplett lesbaren TExt liefern.
Vielleicht hat sich der Urheber ja nicht an die Standards gehalten, und vielleicht will ich mir auch einen Haufen "Fisselarbeit" ersparen, und vielleicht kann ich ja auch Fehler machen? Und woher weiß ich, dass im Lister diese Dinge "wasserdicht" implementiert sind? Daher meine durchaus nicht abwegige Frage nach einem allgemein anerkannten Referenzprogramm.

Gruß, Jürgen
My add-ons and plugins for TC: NiftyLink, mbox, Sequences
User avatar
Sheepdog
Power Member
Power Member
Posts: 5150
Joined: 2003-12-18, 21:44 UTC
Location: Berlin, Germany
Contact:

Post by *Sheepdog »

Juergen wrote:Genau so verstehe ich das auch. Danach stellt es sich aber für mich so dar, dass ein Text entweder das Format UTF-8 hat, oder ASCII/ANSI.
Stimmt, hatte ich nicht von der Seite gesehen, aber Du hast offenbar recht. Wenn UTF-8 (oder 16 oder 32) dann gibt es nur eine Codierung und keine Interpretationsmöglichkeit.
Teilst du denn Lefteus' Auffassung, dass damit das selbe wie mit "UTF-16" gemeint ist, oder bist du anderer Anicht? (Es geht mir um die präzise Definition, nicht darum wieviel Nullen dabei erzeugt werden.)
Ich habe mich noch mal kurz durchs Web geklickt und schlau gemacht.

Laut diesem Artikel sind alle drei Formen gleich Unicode. Jedes denkbare (und nicht denkbare ;) ) Zeichen hat in Unicode eine eindeutige Nummer, z.B. U+004c oder U+10302. Diese Nummer wird mit den verschiedenen Codierungen unterschiedlich ausgedrückt/angesprochen.

U+10302 ist in UTF 32 =$00010302 in UTF 16 =$D800 DF02 und in UTF 8 =$F0 90 8c 82.

Das heisst, das ist alles Unicode nur anders augedrückt (vielleicht vergleichbar damit, dass man die Zahl 16 auch im Hexa Sytem als 10 und binär 1000 0000 ausdrückt).

Weiterhin heisst das: Wenn Du nicht weisst, wie ein Text codiert ist, kannst Du wirklich nur raten. Genauso wie man wissen muss, in welchem System die Zahl 10000000 dargestellt ist. Binär wäre das 128, dezimal 10 Millionen und Hexadezimal 26,8 Millionen.


Vielleicht hat sich der Urheber ja nicht an die Standards gehalten, und vielleicht will ich mir auch einen Haufen "Fisselarbeit" ersparen, und vielleicht kann ich ja auch Fehler machen? Und woher weiß ich, dass im Lister diese Dinge "wasserdicht" implementiert sind?
Da musst Du dem Programm einfach trauen. Im Zweifelsfall gibts Zeichenmüll (stell doch mal die falsche Codierung ein, dann siehst Du was ich meine).
Daher meine durchaus nicht abwegige Frage nach einem allgemein anerkannten Referenzprogramm.
Ist mir nicht bekannt.

sheepdog
"A common mistake that people make when trying to design something
completely foolproof is to underestimate the ingenuity of complete fools."
Douglas Adams
Juergen
Power Member
Power Member
Posts: 517
Joined: 2003-05-02, 18:19 UTC
Location: Berlin (Germany)
Contact:

Post by *Juergen »

Hallo Sheepdog,

sorry wegen der späten Antwort.
Wenn UTF-8 (oder 16 oder 32) dann gibt es nur eine Codierung und keine Interpretationsmöglichkeit.
Daher bin ich eben der Ansicht, dass es falsch weil unmöglich ist, wenn der Lister z.B. anzeigt, dass ein Text UTF-8 und zugleich ANSI codiert sei.
{ Laut diesem Artikel <http://www.unicode.org/versions/Unicode4.0.0/ch03.pdf>} sind alle drei Formen gleich Unicode.
Das entspricht genau meinem Kenntnisstand, bevor ich hier anfragte:
Dass die Bezeichnung "Unicode" ein Oberbegriff sei, und nicht konkret einen bestimmten Code bezeichne. Mein Problem war ja aber, dass der Begriff "Unicode" teilweise in Zusammenhängen (so auch im Lister) verwendet wird, in denen diese Bedeutung keinen Sinn ergibt.

Ich denke, dass Lefteus' historische Erklärung richtig ist. Eine Bestätigung dafür fand ich auf http://www.univie.ac.at/comment/04-3/043_12.html (Oktober 2004):

Code: Select all

UTF-16 ... ist die gebräuchlichste Form von Unicode und wird deshalb oft - fälschlicherweise - als Synonym für Unicode verwendet.
Wenn die Dinge also so sind -- wenn nicht, bitte ich um Korrektur --, dann ist die Darstellung im "Oprtionen"-Menü des Listers in Bezug auf den ersten Punkt falsch, und in Bezug auf den zweiten Punkt missverständlich. Im Moment sieht es ja so aus:

Code: Select all

nur Text
Binär
Hexadezimal
Bild/Multimedia
HTML
Unicode
UTF-8
-------------------------------------
ANSI-Zeichendatz
ASCII-Zeichendatz
Variable Buchstabenbreite
-------------------------------------
Zeilenumbruch
Bild der Fenstergröße anpassen
-------------------------------------
...
Wenn mit "Unicode" UTF-16 gemeint ist, sollte man das auch schreiben, und die Gruppierung wäre IMHO etwa so logischer:

Code: Select all

nur Text
Binär
Hexadezimal
Bild/Multimedia
HTML
-------------------------------------
UTF-8
UTF-16
ANSI
ASCII
-------------------------------------
Variable Buchstabenbreite
Zeilenumbruch
Bild der Fenstergröße anpassen
-------------------------------------
...
Wobei in den beiden ersten Gruppen nur je ein Punkt zutreffen und also mit einem Häckchen versehen sein kann.
Da musst Du dem Programm einfach trauen. Im Zweifelsfall gibts Zeichenmüll (stell doch mal die falsche Codierung ein, dann siehst Du was ich meine).
Mir ist schon klar was du meinst. Aber ich wollte auf etwas anderes hinaus, was ich wahrscheinlich nicht klar genug ausgedrückt hatte. Ist hier wahrscheinlich auch zu sehr OT, aber ich hatte halt gedacht, wo wir schon mal bei Unicode sind ...
Für ein bestimmtes Projekt möchte ich wissen, ob gegebene Dateien z.B. gültigen UTF-8 Code enthalten. Da diese Dateien automatisch verarbeitet werden, kuckt sich die überhaupt niemand an. Außerdem kann ich mir vorstellen, dass man es evtl. nicht unbedingt sieht, wenn nur ein kleiner Fehler enthalten ist.

Gruß, Jürgen
My add-ons and plugins for TC: NiftyLink, mbox, Sequences
User avatar
van Dusen
Power Member
Power Member
Posts: 684
Joined: 2004-09-16, 19:30 UTC
Location: Sinzig (Rhein), Germany

Post by *van Dusen »

Wenn man mit den Bezeichnungen der Zeichensätze im Optionenmenü aufräumt, dann sollten bei der Gelegenheit auch gleich die ungenauen und interpretationsfähigen bzw. gar falschen Angaben "ASCII" und "ANSI" korrigieren:

"ASCII" bezeichnet genau die eine 7-Bit-Codierung, die beim ANSI (quasi dem US-amerikanischen Gegenstück zum DIN) unter der Bezeichnung "ANSI_X3.4-1968" registriert ist, und nix anderes.

Im Lister ist unter "ASCII" wohl eine 8-Bit-Codierung zu verstehen, und zwar die Codepage, die in der Windows-Installation des TC-Benutzers für DOS-Anwendungen (inkl. DOS-Box) eingestellt ist. Auf deutschsprachigen Systemen dürfte dies in der Regel "IBM850" alias "CP850" (alias "OEM 850", Microsofts Bez. dafür) sein.

Und "ANSI"? Da kann man nur raten, dass darunter die Codepage zu verstehen ist, die in der Windows-Installation des TC-Benutzers für Windows(-Anwendungen) eingestellt ist. Auf deutschsprachigen Systemen dürfte dies in der Regel "Windows-1252" alias "CP1252" sein.


Falls diese Menüeinträge nicht dynamisch entsprechend der Systemkonfiguration anzeigbar sind, dann fänd' ich's zumindest besser, "DOS-Zeichensatz" statt "ASCII-Zeichensatz" und "Windows-Zeichensatz" statt "ANSI-Zeichensatz" anzugeben. Das Argument "historisch gewachsen und daher für jeden verständlich" traf zumindest auf mich nicht zu: Bis vor einiger Zeit war ich bei Menüpunkten wie "OEM-Zeichensatz" und "ANSI-Zeichensatz" in Texteditoren, im Lister usw. immer etwas ratlos, was denn genau darunter zu verstehen sei.


Die ersten 128 Zeichen entsprechen in Unicode übrigens ASCII. In UTF-8 werden diese ersten 128 Codes überdies mit nur einem Byte codiert. Ein Text, der aus purem ASCII besteht, ist also in ASCII-Codierung und in Unicode (UTF-8) binäridentisch. Die ersten 256 Zeichen des Unicode-Zeichensatzes entsprechen dem Zeichensatz "ISO-8859-1". Hier ein paar Zeichensatztabellen, die ich mir mal aus Wikipedia-, IBM- und Microsoft-Seiten (und weiteren) zusammengestellt hatte:
http://rapidshare.de/files/17368425/Zeichensaetze.ods.html
Juergen
Power Member
Power Member
Posts: 517
Joined: 2003-05-02, 18:19 UTC
Location: Berlin (Germany)
Contact:

Post by *Juergen »

van Dusen wrote:Wenn man mit den Bezeichnungen der Zeichensätze im Optionenmenü aufräumt, dann sollten bei der Gelegenheit auch gleich die ungenauen und interpretationsfähigen bzw. gar falschen Angaben "ASCII" und "ANSI" korrigieren:
Jetzt wo du es sagst ... :)
Ja, ich bin auch dieser Ansicht.

Gruß, Jürgen
My add-ons and plugins for TC: NiftyLink, mbox, Sequences
User avatar
Stance
Power Member
Power Member
Posts: 1079
Joined: 2005-03-29, 06:26 UTC

Post by *Stance »

Hallo!
Im Total Commander Wiki gibt es bereits einen ähnlichen Verbesserungsvorschlag:
Lister mit besserer Unicode/UTF-8-Unterstützung

Wäre doch schade, wenn euer Wissen zu diesem Thema im Forum versinken würde, oder? :wink:

Grüsse
Stance
Post Reply