Laden...

ISO-8859-1 vs Windows-1252

Erstellt von Rodney vor 16 Jahren Letzter Beitrag vor 16 Jahren 5.457 Views
R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren
ISO-8859-1 vs Windows-1252

Hallo Leute,

Windows unterstützt ja leider nicht den vollen ISO-8859-1 Zeichensatz, sondern weicht davon in einigen Zeichen ab, was sich dann Windows-1252 nennt.

Gibt es irgendeine Möglichkeit aus .net2 heraus im wirklichen ISO-8859-1 Zeichensatz abzuspeichern? Da ich kompatibel mit anderen Plattformen sein muss, geht es nicht anders.

Hat man gleichzeitig eine Möglichkeit herauszufinden, ob ein String der nunmal in c# als Unicode vorliegt ohne Verluste in iso-8859-1 gespeichert werden kann, er also keine "fremden" Zeichen enthält?

Gruß, Rodney

476 Beiträge seit 2004
vor 16 Jahren

hallo Rodney,

Encoding-Klasse sollte Aufschluss geben.


  // iso-8859-1
  Encoding isoEncoding = Encoding.GetEncoding(28591);

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren

hallo Rodney,


>
sollte Aufschluss geben.

  
  // iso-8859-1  
  Encoding isoEncoding = Encoding.GetEncoding(28591);  
  

-yellow

Ja den MSDN-Artikel kenne ich natürlich, ebenso arbeite ich bereits mit der Encoding-Klasse. Nur hilft mir das bei meinem Problem bis jetzt nicht weiter, die Funktionen scheinen mir nicht hilfreich.

Gruß, Rodney

S
8.746 Beiträge seit 2005
vor 16 Jahren

Windows unterstützt ja leider nicht den vollen ISO-8859-1 Zeichensatz...

Das stimmt nicht. Du meinst, dass die Windows-ANSI-Codepage 1252 nicht ISO-8859-1 entspricht.

Windows 1252 ist eine Erweiterung von ISO-8859-1 (im bei ISO nicht benutzten Bereich von $80-$90), es enthält z.B. das Euro-Zeichen.

http://www.microsoft.com/globaldev/reference/sbcs/1252.mspx
http://www.microsoft.com/globaldev/reference/iso/28591.mspx
http://de.wikipedia.org/wiki/ISO_8859-15

Und wie Yellow geschrieben hat:

Codepage 28591 entspricht ISO-8859-1 (auch bekannt als Latin-1).

ISO-8859-1 gilt wegen des fehlenden Euro-Zeichens und der Nicht-Unterstützung von französisch und finnisch als obsolet. Es sollte besser ISO-8859-15 (Latin-9) verwendet werden. Das entspricht Codepage 28605.

Achtung: Codepgae und Windows-Codepage nicht verwechseln.

Statt GetEncoding(28591) geht übrigens auch GetEncoding("ISO-8859-1").

Lasse einfach mal dieses Codeschnippsel laufen. Du wirst sehen, dass Windows alle relevanten Encodings enthält.

using System;
using System.Text;

public class SamplesEncoding
{

    public static void Main()
    {

        // Print the header.
        Console.Write("Name               ");
        Console.Write("CodePage  ");
        Console.Write("BodyName           ");
        Console.Write("HeaderName         ");
        Console.Write("WebName            ");
        Console.WriteLine("Encoding.EncodingName");

        foreach (EncodingInfo ei in Encoding.GetEncodings())
        {
            Encoding e = ei.GetEncoding();

                Console.Write("{0,-18} ", ei.Name);
                Console.Write("{0,-9} ", e.CodePage);
                Console.Write("{0,-18} ", e.BodyName);
                Console.Write("{0,-18} ", e.HeaderName);
                Console.Write("{0,-18} ", e.WebName);
                Console.WriteLine("{0} ", e.EncodingName);

        }
        Console.ReadLine();
    }
}
R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren

Hallo svenson,

erstmal vielen Dank für deine umfassende Antwort.

du schreibst ja selbst
"Windows 1252 ist eine Erweiterung von ISO-8859-1 (im bei ISO nicht benutzten Bereich von $80-$90), es enthält z.B. das Euro-Zeichen."

Wenn ich jetzt einen StreamWriter per


new StreamWriter(filename, false, Encoding.GetEncoding("iso-8859-1"));

öffne, und dann ein €-Zeichen abspeichere, wird dieses auch in der Datei als € angezeigt, obwohl dieses doch im iso-8859-1 Satz nicht enthalten sein sollte.
Das will ich eben verhindern, Windows soll nicht seinen erweiterten Zeichensatz da anwenden. Alle Zeichen die nicht im original iso-8859-1-satz vorkommen, will ich stattdessen als Unicode-Escapes abspeichern. (also bspw. das €-Zeichen durch \u20AC ersetzen)
Daher meine Frage, wie ich herausbekomme, ob einzelne Zeichen im gewählten Encoding vorhanden sind.

Gruß, Rodney

S
8.746 Beiträge seit 2005
vor 16 Jahren

Was in besagtem Bereich angezeigt wird, ist schlicht nicht definiert. Da kann alles rauskommen, €, ?, etc..

Eine solche Filter-Funktion gibt es meines Wissens nicht. Du müßtest also die entsprechenden Zeichen per Hand rausfiltern oder ersetzen. Bei ANSI ja recht einfach, weil 1-Byte-Code und der Bereich klar definiert ist.

Tipp: Baue dir einfach ein eigenes 8859-1-Encoding auf besagter Basis. Kostet nur minimal Aufwand und kannst die Filterung dort sauber unterbringen.

R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren

Was in besagtem Bereich angezeigt wird, ist schlicht nicht definiert. Da kann alles rauskommen, €, ?, etc..

Eine solche Filter-Funktion gibt es meines Wissens nicht. Du müßtest also die entsprechenden Zeichen per Hand rausfiltern oder ersetzen. Bei ANSI ja recht einfach, weil 1-Byte-Code und der Bereich klar definiert ist.

Tipp: Baue dir einfach ein eigenes 8859-1-Encoding auf besagter Basis. Kostet nur minimal Aufwand und kannst die Filterung dort sauber unterbringen.

Hallo svenson,

ok, wenn das nicht definiert ist muss ich da tatsächlich anders ran.

Ich verstehe nicht was du mit

Bei ANSI ja recht einfach, weil 1-Byte-Code und der Bereich klar definiert ist. meinst, ich habe den String ja in Unicode vorliegen.

Meine Idee wäre jetzt einfach, den Zahlenwert vom Unicode-Zeichen zu nehmen und zu gucken, ob der im ISO-8859-1 vertreten ist.

Jetzt bräuchte ich nur noch die Zahlenbereiche in denen das der Fall ist. Nur wo bekomme ich die her? Wikipedia schreibt

In Unicode finden Zeichen der wichtigsten ISO-Zeichensätze wie die ISO-Normen der Serie 8859 eine 1:1-Entsprechung (das bedeutet, dass bei einer Konvertierung von ISO zu Unicode und zurück das gleiche Ergebnis herauskommt)

Das soll aber nicht bedeuten, dass die ISO-8859-1 Zahlenwerte, mit den Unicode-Zahlenwerten übereinstimmen oder? Das wäre ja zu schön, um wahr zu sein.

R
Rodney Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren

So, ich habe gerade noch einmal recherchiert.
Die Werte scheinen tatsächlich identisch zu sein.

Für die folgenden Bereiche des Unicode-Zeichensatzes gibt es imo ein Äquivalent in ISO-8859-1:

32-127, 145-256

Laut meiner Recherche müssten das alle sein.

S
8.746 Beiträge seit 2005
vor 16 Jahren

Hier mal ein Beispiel für die Implementierung eines eigene Encodings:

http://blogs.ittoolbox.com/visualbasic/dotnet/archives/howto-implement-a-text-encoder-in-net-20-13243

Im Prinzip brauchst du fast nix selbst zu machen. Einfach das Iso-8859-1-Encoding innerhalb benutzen und dann die einzelnen Zeichen nochmals nach (!) der Encodierung prüfen und ggf. deine Escapes einfügen.