it-swarm.com.de

Wie kann ich einen String in C # in UTF-8 umwandeln?

Ich habe eine Zeichenfolge, die ich von einer Drittanbieter-App erhalte, und ich möchte sie in einer beliebigen Sprache mit C # auf meinem Windows Surface korrekt anzeigen.

Aufgrund einer falschen Kodierung sieht ein Teil meiner Zeichenfolge auf Spanisch so aus:

Acción

während es so aussehen sollte:

Acción

Laut der Antwort auf diese Frage: Wie man die Zeichenkettencodierung in C # kennt sollte die Codierung, die ich erhalte, bereits auf UTF-8 kommen, aber sie wird auf Encoding.Default gelesen (wahrscheinlich ANSI?) .

Ich versuche, diesen String in echtes UTF-8 umzuwandeln, aber eines der Probleme ist, dass ich nur eine Teilmenge der Encoding-Klasse sehen kann (nur UTF8- und Unicode-Eigenschaften), wahrscheinlich, weil ich auf die Windows-Oberflächen-API beschränkt bin.

Ich habe einige Schnipsel aus dem Internet ausprobiert, aber bisher hat sich keines für osteuropäische Sprachen (d. H. Koreanisch) als erfolgreich erwiesen. Ein Beispiel ist wie folgt:

var utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(myString);
myString= utf8.GetString(utfBytes, 0, utfBytes.Length);     

Ich habe auch versucht, die Zeichenfolge in ein Byte-Array zu extrahieren und dann UTF8.GetString zu verwenden:

byte[] myByteArray = new byte[myString.Length];
for (int ix = 0; ix < myString.Length; ++ix)
{
    char ch = myString[ix];
    myByteArray[ix] = (byte) ch;
}

myString = Encoding.UTF8.GetString(myByteArray, 0, myString.Length);

Habt ihr noch andere Ideen, die ich ausprobieren könnte?

132
Gaara

Wie Sie wissen, wird die Zeichenfolge als Encoding.Default Eingegeben. Sie können einfach Folgendes verwenden:

byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);

Eine andere Sache, an die Sie sich erinnern müssen: Wenn Sie Console.WriteLine verwenden, um einige Zeichenfolgen auszugeben, sollten Sie auch Console.OutputEncoding = System.Text.Encoding.UTF8; Schreiben !!! Oder alle utf8 Strings werden als gbk ausgegeben ...

229
anothershrubery
string utf8String = "Acción";
string propEncodeString = string.Empty;

byte[] utf8_Bytes = new byte[utf8String.Length];
for (int i = 0; i < utf8String.Length; ++i)
{
   utf8_Bytes[i] = (byte)utf8String[i];
}

propEncodeString = Encoding.UTF8.GetString(utf8_Bytes, 0, utf8_Bytes.Length);

Die Ausgabe sollte so aussehen

Acción

tagesanzeigen Tagesanzeigen

call DecodeFromUtf8 ();

private static void DecodeFromUtf8()
{
    string utf8_String = "day’s";
    byte[] bytes = Encoding.Default.GetBytes(utf8_String);
    utf8_String = Encoding.UTF8.GetString(bytes);
}
16
MethodMan

Ihr Code liest eine Sequenz von UTF8-codierten Bytes und decodiert sie mit einer 8-Bit-Codierung.

Sie müssen diesen Code korrigieren, um die Bytes als UTF8 zu dekodieren.

Alternativ (nicht ideal) können Sie die fehlerhafte Zeichenfolge zurück in das ursprüngliche Byte-Array konvertieren, indem Sie sie mit der falschen Codierung codieren und die Bytes dann als UTF8 neu decodieren.

12
SLaks
 Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(mystring));
5
Riadh Hammouda

Wenn Sie eine Zeichenfolge in der MySQL-Datenbank speichern möchten, gehen Sie wie folgt vor: ->

Ihre Datenbankfeldstruktur in phpmyadmin [oder einem anderen Control Panel] sollte auf utf8-gerneral-ci eingestellt sein

2) Sie sollten Ihre Zeichenfolge ändern [Bsp. textbox1.text] zu Byte

2-1) definiere Byte [] st2;

2-2) konvertieren Sie Ihren String [textbox1.text] nach Unicode [mmultibyte string] durch:

byte[] st2 = System.Text.Encoding.UTF8.GetBytes(textBox1.Text);

3) Führen Sie diesen SQL-Befehl vor jeder Abfrage aus:

string mysql_query2 = "SET NAMES 'utf8'";
cmd.CommandText = mysql_query2;
cmd.ExecuteNonQuery();

3-2) Jetzt sollten Sie diesen Wert zum Beispiel in das Namensfeld einfügen, indem Sie:

cmd.CommandText = "INSERT INTO customer (`name`) values (@name)";

4) die Hauptaufgabe, die viele Lösungen nicht beachteten, ist die folgende Zeile: Sie sollten addwithvalue anstelle von add in command parameter wie folgt verwenden:

cmd.Parameters.AddWithValue("@name",ut);

++++++++++++++++++++++++++++++++++ Genießen Sie echte Daten auf Ihrem Datenbankserver statt ????

Verwenden Sie den folgenden Codeausschnitt, um Bytes aus der CSV-Datei abzurufen

protected byte[] GetCSVFileContent(string fileName)
    {
        StringBuilder sb = new StringBuilder();
        using (StreamReader sr = new StreamReader(fileName, Encoding.Default, true))
        {
            String line;
            // Read and display lines from the file until the end of 
            // the file is reached.
            while ((line = sr.ReadLine()) != null)
            {
                sb.AppendLine(line);
            }
        }
        string allines = sb.ToString();


        UTF8Encoding utf8 = new UTF8Encoding();


        var preamble = utf8.GetPreamble();

        var data = utf8.GetBytes(allines);


        return data;
    }

Rufen Sie das Folgende auf und speichern Sie es als Anhang

           Encoding csvEncoding = Encoding.UTF8;
                   //byte[] csvFile = GetCSVFileContent(FileUpload1.PostedFile.FileName);
          byte[] csvFile = GetCSVFileContent("Your_CSV_File_NAme");


        string attachment = String.Format("attachment; filename={0}.csv", "uomEncoded");

        Response.Clear();
        Response.ClearHeaders();
        Response.ClearContent();
        Response.ContentType = "text/csv";
        Response.ContentEncoding = csvEncoding;
        Response.AppendHeader("Content-Disposition", attachment);
        //Response.BinaryWrite(csvEncoding.GetPreamble());
        Response.BinaryWrite(csvFile);
        Response.Flush();
        Response.End();
3
jAntoni