File encoding O_O
-
Hallihallo
Wie schaff ich es, herauszufinden, ob ein File ascii- oder unicode-codiert ist??
Aufgefallen ist mir das "Problem", wie ich angefangen hab, mit StreamReader und StreamWriter zu "experimentieren"
Komische ist, dass der StreamReader immer das richtige Encoding nimmt.
Ergo:using namespace System; using namespace System::IO;
FileStream^ fs = gcnew FileStream ("Text.txt", FileMode::Open); StreamReader^ sr = gcnew StreamReader (fs); Console::WriteLine (sr->ReadLine ());
gibt immer was vernünftiges aus, egal ob das File unicode oder ascii-codiert ist.
Allerdings das:
using namespace System; using namespace System::IO;
FileStream^ fs = gcnew FileStream ("Text.txt", FileMode::Open); StreamWriter^ sr = gcnew StreamWriter (fs); sr->WriteLine ("Hello");
schreibt AsciiCode in das File, auch wenns Unicode-codiert ist
Jetzt hab ich nachgelesen und gefunden, dass man im Konstruktor von StreamWriter ein Text::Encoding übergeben werden kann. Soweit so gut ... nur wie finde ich jetzt heraus wie das File codiert ist??
Ich habs jetzt gelöst, dass ich immer einen StreamReader erstell, weil der nämlich ein Propery CurrentEncoding hat...
Also so:using namespace System; using namespace System::IO;
FileStream^ fs = gcnew FileStream ("Text.txt", FileMode::Open); StreamReader^ sr = gcnew StreamReader (fs); StreamWriter^ sw = gcnew StreamWriter (fs, sr->CurrentEncoding); sw->WriteLine ("Hello");
Aber das kanns doch nicht sein ...... oder
Danke
-
Such mal ein wenig im C# Forum mit den Begriffen Unicode UTF8 etc, es gibt einige Beiträge. u.A. gibt es einen, der sich mit Deinem Problem befasst. (Musst aber ein paar Beiträge überspringen , es war am Anfang nicht wirklich Konstruktiv. Ich nehme aber an, das gegen Ende wertvolle Details für Dich auftauchen).
Auf die schnelle habe ich leider nichts gefunden. Es gibt auch noch in den Artikeln einen der sich mit Unicode beschäftigt. Wie weit dieser .Net berücksichtigt weiß ich jedoch nicht.
-
Wenn kein BOM vorhanden ist, kannst Du es nicht rausfinden.
-
@Knuddlbaer
Hab da mal gesucht, bin aber auch nicht wirklich glücklich geworden ^^
Macht aber nix ... trotzdem thx@Jochen
Jo, das dachte ich fasst.
ThxAber jetzt wirft sich mir noch eine weitere Frage bezüglich Unicode usw auf.
Ich hab bis jetzt eigentlich immer C++/WinAPI programmiert.
Da hat es geheisen: Ab jetzt stellt Windows auf Unicode um ---> ergo statt
CHAR=WCHAR
strcpy=wcscpy
"Test123"=L"Test123"Wie is das in .Net??
Da gibts die Klasse String, die das ganze handlet....
Muss ich jetztString^ string = "Test"; string = "{" + string + "}";
oder
String^ string = L"Test"; string = L"{" + string + L"}";
schreiben??
Oder ist das egal?
Das das gleiche raus kommt, is mir klar ... aber wie siehts mit der performance aus??
Wird "Test" und "{" zur CompileTime gleich auf Unicode umgewandelt?Weiters... was passiert wenn ich
StreamReader^ sr (IrgendeinStream, Text::Encoding::ASCII); String^ string = sr->ReadToEnd ();
mach??
Wird da der ganze Inhalt des Streams in Unicode gewandelt??MfG
-
.NET kennt nur Unicode als String.
Der Compiler (ab VC2005) macht automatisch aus einem String-Literal ein Unicode-String. Du musst weder ein "L" noch wie bei VC2002/2003 ein "S" davorschreiben...
Du kannst aber schreiben was Du willst (mit oder ohne L), der Compiler macht das gleiche draus...Und: Ja, wenn der Stream in einen String gewandelt wird, dann wird Unicode draus, das "String" nur Unicode kann (oder sagen wir mal UTF16)...
-
Aha
Besten dank Jochen