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
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
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
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();
}
}
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
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.
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.
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.
Hier mal ein Beispiel für die Implementierung eines eigene Encodings:
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.