risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come posso trasformare la stringa in UTF-8 in C #?

Ho una stringa che ricevo da un'app di terze parti e vorrei visualizzarla correttamente in qualsiasi lingua utilizzando C # sul mio Windows Surface.

A causa di una codifica errata, un pezzo della mia stringa è simile a questo in spagnolo:

Acción

mentre dovrebbe essere simile a questo:

Acción

Secondo la risposta a questa domanda: Come conoscere la codifica delle stringhe in C # , la codifica che sto ricevendo dovrebbe essere già in UTF-8, ma viene letto su Encoding.Default (probabilmente ANSI?).

Sto cercando di trasformare questa stringa in vero UTF-8, ma uno dei problemi è che posso vedere solo un sottoinsieme della classe Encoding (solo le proprietà UTF8 e Unicode), probabilmente perché sono limitato all'API di Windows.

Ho provato alcuni frammenti che ho trovato su internet, ma nessuno di loro ha avuto successo finora per le lingue orientali (ad esempio coreano). Un esempio è il seguente:

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

Ho anche provato a estrarre la stringa in un array di byte e quindi a utilizzare UTF8.GetString:

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);

Avete qualche altra idea che potrei provare?

128
Gaara

Come sapete, la stringa sta arrivando come Encoding.Default, potreste semplicemente usare:

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

Un'altra cosa che dovresti ricordare: se stai usando Console.WriteLine per emettere alcune stringhe, dovresti scrivere anche Console.OutputEncoding = System.Text.Encoding.UTF8; !!! O tutte le stringhe utf8 saranno emesse come gbk ...

221
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);

L'output dovrebbe essere simile

Acción

giorno's display's day

chiama 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

Il tuo codice legge una sequenza di byte codificati in UTF8 e li decodifica usando una codifica a 8 bit.

Devi correggere quel codice per decodificare i byte come UTF8.

In alternativa ( non ideale ), è possibile convertire la stringa errata nell'array di byte originale, codificandolo utilizzando la codifica errata, quindi decodificare nuovamente la stringa byte come UTF8.

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

Se vuoi salvare qualsiasi stringa nel database mysql fai questo: ->

La struttura del campo del tuo database phpmyadmin [o qualsiasi altro pannello di controllo] dovrebbe essere impostato su utf8-gerneral-ci

2) dovresti cambiare la tua corda [Es. textbox1.text] a byte, quindi

2-1) definisce il byte [] st2;

2-2) converti la stringa [textbox1.text] in unicode [stringa mmultibyte] di:

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

3) esegui questo comando sql prima di qualsiasi query:

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

3-2) ora dovresti inserire questo valore in per esempio campo nome per:

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

4) il lavoro principale a cui molte soluzioni non hanno attirato l'attenzione è la riga sottostante: dovresti usare addwithvalue invece del parametro comando add come di seguito:

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

++++++++++++++++++++++++++++++++++ godono di dati reali nel server del database anziché ????

5

Usa lo snippet di codice seguente per ottenere i byte dal file csv

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;
    }

Chiama il seguente e salvalo come allegato

           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