Laden...

Editieren der *.csproj (xml) schreibt kryptografische Zeichen statt Umlaute als Klassennamen

Erstellt von Dudunaut vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.309 Views
D
Dudunaut Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren
Editieren der *.csproj (xml) schreibt kryptografische Zeichen statt Umlaute als Klassennamen

Hallo liebe Mitglieder,

mein Name ist David, bin 24 Jahre alt und habe 4 Semester technische Informatik studiert, jedoch wegen Mathe abgebrochen 😠

Jetzt mache ich eine Ausbildung zum Fachinformatiker - Anwendungsentwicklung und schon werde ich (nach 4 Wochen) vor ein großes Problem in unserem Programm gestellt, bei dem keiner wirklich weiter weiß!

Es geht um einen Workflow, der automatisch einen Workflow erstellen soll 😉

Soweit so gut, funktioniert soweit auch, außer EINE SACHE...

Ich lese mit einem FileReader die .csproj komplett in eine Liste (mit jeweils Zeillen) ein.
Nun sucht er meinen Kommentar, und schreibt mit einem FileWriter dort unter den Kommentar die neuen Klassennamen (die im Projekt kopiert und hinzugefügt worden sind) hinein.

Das Problem ist nun: Es gibt ein Paar Klassen (100te) die umlaute besitzen!
Diese liest er richtig mit "ä" ein, aber schreibt IMMER ein VIERECK...
Egal, wie ich es mache (utf8, utf 32, iso, default usw.).
(Macht er im Debug-Modus und auch wenn ich die .exe ausführe) 😭

Dies macht er auch, mit meinen "Vorlageklassen" die kopiert werden und in das Projekt eingefügt werden, und dort dann die "Platzhalter" ersetzt werden.
bei jedem Umlaut schreibt er irgendein komisches Zeichen!

Niemand in der Firma weiß einen Rat, und jetzt frage ich euch: Kennt dieses Problem jemand, und kann mir evtl. Abhilfe schaffen? :rtfm:

PS: Alles zur Laufzeit!!!

Die Klassen an sich werden erst nach dem Beenden des Programmes in das Projekt in VS hinzugefügt (Projektmappe neuladen)

Hinweis von Coffeebean vor 8 Jahren

Ich habe mal den Titel editiert. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 3. Wenn du einen besseren Vorschlag hast, dann editier ihn nochmal. Kein Suchender wird wissen, was mit dem Titel "FileReader und FileWriter" gemeint ist, wenn er den Thread in der Suche findet. Dein Problem hat mit Umlauten zu tun. Das sollte im Titel auch klar werden.

127 Beiträge seit 2015
vor 8 Jahren

Kannst du dein Problem etwas mit Codeauszügen näher erläutern?
Was heißt "liest er richtig"? Wie/wo hast du das verifiziert?
Was und wie schreibst du das wieder wohin?

Denn im Moment kann ich mir zumindest nicht vorstellen woher genau dein Problem kommen soll, vor allem weil du schon mit Encodings gearbeitet hast, deiner Aussage nach.

D
Dudunaut Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

Hi, erstmals schön, dass du so schnell antwortest 😉

Bin nur grade nicht in der Arbeit XD , werde morgen mal nachfragen in wiefern ich das aus Datenschutzgründen hier posten darf.

Mit einem Haltepunkt im Debug-Modus kann man doch gucken, ob er die Datei bzw. Zeilen richtig einliest.
Da steht auch immer (richtigerweise) die Umlaute drin. Nur dann in der Datei selbst nicht.
Und ja, ich habe (soweit ich weiß) alle möglichen encodings versucht, aber anscheinend liegt es nicht an dieser Thematik.

127 Beiträge seit 2015
vor 8 Jahren

Was anderes als Encoding würde mir da aber spontan nicht einfallen.
Wenn also der eingelesene String Umlaute enthält, ist das FileReading schon mal nicht das Problem.
Hier wird also offensichtlich das richtige Encoding verwendet (implizit oder explizit).

Das heißt es kann nur noch am schreiben liegen:
Und wenn du die Datei mit dem richtigen Encoding geöffnet hast, sollte eigentlich hier auch der richtige Wert in der Datei landen.
Dein "soweit ich weiß" macht mich jetzt allerdings etwas stutzig. Du bist dir also nicht sicher ob du Encodings verwendet hast?

Du siehst also, warum ich ohne den echten Code nicht wirklich nachvollziehen kann wo das Problem herkommen könnte.

D
Dudunaut Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

Ich werde mich morgen darum kümmern, ich bin ab 7 uhr in der Arbeit, das bedeutet vormittag steht hier mehr falls ich das darf!

Doch, ich habe dem Filereader UND Filewriter die encoding-Argumente übergeben. Alle möglichen... utf8, utf32, iso, default, 1252. ich glaube das sind soweit alle, die Umlaute verwenden. Falls ich mich täusche, sagt es mir, ich bin wirklich für JEDEN Tipp dankbar xD
Die .csproj ist übrigens eine xml und mit utf8 codiert. Aber die .csproj ist ja nicht das einzige Problem xD

D
Dudunaut Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

Guten Morgen zusammen.

Der Source wurde aus Datenschutzgründen abgeändert, aber dennoch leserlich und verständlich gehalten.
Nachfolgend der Code:

--> WorkflowCreateBO.cs


/* Hier wird die Klasse und ihre Interfaces usw. definiert. Außerdem werden Pfade und Übergabeparameter initialisiert...
   Relevante Methoden für meine Frage sind unten stehend
   In den ersten Beiden Regions werden nur die VorlageDateien kopiert.
\*/

        // Entweder
        #region Kopiere Purge
		//Inhalt aus Datenschutzgründen nicht eingefügt
        #endregion Kopiere Purge

	// Oder
	#region Kopiere Nicht-Purge
		//Inhalt aus Datenschutzgründen nicht eingefügt
        #endregion Kopiere Nicht-Purge


 	#region Text in csproj.
		//Inhalt aus Datenschutzgründen nicht eingefügt --> Ist aber hier mit read u. write das Geliche wie in #region Text in BL-Klasse
        #endregion Text in csproj.


  	#region Text in BL-Klasse
        /// <summary>
        /// --> TEIL 1
        ///     Baut den String der hinzuzufügenden Zeilen zusammen
        ///     Liest die komplette Datei ein
        ///     Sucht dann nach der Zeile, in der "base.BuildUp();" vorhanden ist
        ///     und schreibt unterhalb dieser Zeile, die einzufügende Zeile
        /// --> TEIL 2
        ///     Liest die Datei von hinten
        ///     Sucht nach der 2. Klammer "}"
        ///     Schreibt über die 2. Klammer die einzufügende Methode
        /// </summary>
        /// <param name="tifc">Instanziierung von TIFControl</param>
        /// <param name="filePath">Pfad der zur Datei führt</param>
        /// <param name="workflowName">Vergebener Name des Workflows</param>
        private void AddLinesToBL(TIFControl tifc, string filePath, string workflowName)
        {
            string lineToAdd = "            actionDictionary.Add(DomainCommandNames.rb" + workflowName + " ," + workflowName + ");";

            try // if file can be found
            {
                var txtLines = File.ReadAllLines(filePath, System.Text.Encoding.GetEncoding(0)).ToList();

                // Registrieren des Commandnames
                for(int i = 0; i < txtLines.Count; i++)
                {
                    if (txtLines[i].Contains("base.BuildUp();"))
                    {
                        txtLines.Insert(txtLines.IndexOf(txtLines[i]) + 1, lineToAdd);
                        break;
                    }  
                }

                // Aufruf der Action hinzufügen
                int countKlammer = 0; 
                for (int i = txtLines.Count-1; i > 0; i--)
                {
                    if (txtLines[i].Contains("}") && countKlammer == 0)
                    {
                        countKlammer++;
                    }
                    else if (txtLines[i].Contains("}") && countKlammer == 1)
                    {
                        txtLines.Insert(txtLines.IndexOf(txtLines[i]), "        public void " + tifc.WorkflowWorkflowBezeichnung + "(IUnityContainer container)");
                        txtLines.Insert(txtLines.IndexOf(txtLines[i + 1]), "        {");
                        txtLines.Insert(txtLines.IndexOf(txtLines[i + 2]), "            new " + tifc.WorkflowWorkflowBezeichnung + "Action(container, new WorkflowStartQuery(ViewPresenter)).Start();");
                        txtLines.Insert(txtLines.IndexOf(txtLines[i + 3]), "        }");
                        break;
                    }
                }
                File.WriteAllLines(filePath, txtLines, System.Text.Encoding.GetEncoding(0));
            }
            catch (FileNotFoundException e)
            {
                SSwMessageBox.Show(e.Message, "File not found");
            } 
        }
        #endregion Text in BL-Klasse


 	#region Text in CommandNames-Klasse
		//Inhalt aus Datenschutzgründen nicht eingefügt --> Ist aber hier mit read u. write das Geliche wie in #region Text in BL-Klasse
        #endregion Text in CommandNames-Klasse



	#region Platzhalter in Klassen ersetzen
		//Inhalt aus Datenschutzgründen nicht eingefügt --> Ist aber hier mit read u. write das Geliche wie in #region Text in BL-Klasse
        #endregion Platzhalter in Klassen ersetzen

--> BL-Klasse.cs


// Usings

// Namespace
{

    /// <summary>
    ///     --> Hier zum Beispiel ist im Source ein ä enthalten          // Nur als Beispiel!
    /// </summary>
    public class CommandActionServiceAnfrageBL : //Ableitung
    {
        public override void BuildUp()
        {
            base.BuildUp();
            actionDictionary.Add(DomainCommandNames.rbAnfrageKopieren, AnfrageKopieren);
            //Weitere Dictionary
        }

        public void AnfrageKopieren(IUnityContainer container)
        {
            new AnfrageKopierenAction(container, new WorkflowStartQuery(ViewPresenter)).Start();
        }
        //Weitere Aufrufe
    }
}

Ich hoffe Ihr könnt mir jetzt etwas weiterhelfen!

F
10.010 Beiträge seit 2004
vor 8 Jahren
 System.Text.Encoding.GetEncoding(0)

Was meinst du damit zu bewerkstelligen?

Benutze

 System.Text.Encoding.Default
D
Dudunaut Themenstarter:in
5 Beiträge seit 2015
vor 8 Jahren

System.Text.Encoding.GetEncoding(0)

war mein letzter Versuch.

Wie gesagt, default habe ich schon probiert, funktioniert auch nicht.

16.834 Beiträge seit 2008
vor 8 Jahren

0 ist default.

1.029 Beiträge seit 2010
vor 8 Jahren

Hi,

folgender Code funktioniert bei mir:

static void Main(string[] args)
		{
			string fileName = @"C:\Users\*******\Desktop\test.txt";
			string toInsertAfter = "Ä";
			string lineToInsert = "äöü";
			string[] lines = null;

			using (StreamReader sr = new StreamReader(fileName, System.Text.Encoding.UTF8))
			{
				lines = sr.ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
			}

			File.Delete(fileName);
			using (StreamWriter sw = new StreamWriter(fileName, false, System.Text.Encoding.UTF8))
			{
				foreach (string line in lines)
				{
					sw.WriteLine(line);
					if (line.Equals(toInsertAfter))
						sw.WriteLine(lineToInsert);
				}
			}
		}

Zumindest solange die Datei zum Start auch wirklich mit UTF8 kodiert ist. Hast du mal überprüft, dass die entsprechenden Dateien auch wirklich in UTF8 vorliegen? z.B. mal mit Notepad++ schauen...

LG

5.658 Beiträge seit 2006
vor 8 Jahren

Hi Dudunaut,

txtLines.Insert(txtLines.IndexOf(txtLines[i]), "        public void " + tifc.WorkflowWorkflowBezeichnung + "(IUnityContainer container)");

Das ist schon eine sehr merkwürdige Konstruktion. Wozu rufst du die IndexOf-Methode auf, wenn du den Index schon hast?

Ansonsten klingt es in deiner Beschreibung so, als betreffen die fehlerhaften Umlaute die Methoden-Bezeichner. Was steht also in tifc.WorkflowWorkflowBezeichnung? Woher kommt der Wert? Und hast du mal mit dem Debugger geschaut, ob dort die Umlaute richtig dargestellt werden?

Christian

Weeks of programming can save you hours of planning