¿Cómo puedo transformar una cadena en UTF-8 en C #?

Tengo una cadena que recibo de una aplicación de un tercero y me gustaría mostrarla correctamente en cualquier idioma usando C # en mi Windows Surface.

Debido a una encoding incorrecta, una parte de mi cadena se ve así en español:

Acción

mientras que debería ser así:

Acción

De acuerdo con la respuesta a esta pregunta: cómo saber la encoding de cadena en C # , la encoding que estoy recibiendo ya debería estar en UTF-8, pero se lee en Encoding.Default (¿probablemente ANSI?).

Estoy intentando transformar esta cadena en UTF-8 real, pero uno de los problemas es que solo puedo ver un subconjunto de la clase de encoding (solo las propiedades UTF8 y Unicode), probablemente porque estoy limitado a la API de superficie de Windows.

He intentado algunos fragmentos que he encontrado en Internet, pero ninguno ha resultado exitoso hasta ahora para los idiomas orientales (es decir, coreano). Un ejemplo es el siguiente:

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

También intenté extraer la cadena en una matriz de bytes y luego usar 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); 

¿Ustedes tienen alguna otra idea que yo pueda probar?

Como sabes, la cadena está entrando como Encoding.Default manera Encoding.Default , simplemente puedes usar:

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

Otra cosa que debe recordar: si está utilizando Console.WriteLine para generar algunas cadenas, también debe escribir Console.OutputEncoding = System.Text.Encoding.UTF8; !!! O todas las cadenas utf8 serán superadas como gbk …

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

// La salida debería verse como

Acción

el día muestra el día

llama a DecodeFromUtf8 ();

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

Su código está leyendo una secuencia de bytes codificados en UTF8 y decodificándolos usando una encoding de 8 bits.

Necesita corregir ese código para decodificar los bytes como UTF8.

Alternativamente ( no ideal ), puede convertir la cadena incorrecta de nuevo a la matriz de bytes original, codificándola usando la encoding incorrecta, y luego volver a decodificar los bytes como UTF8.

Si desea guardar cualquier cadena en la base de datos mysql, haga lo siguiente: ->

La estructura de su campo de base de datos i phpmyadmin [o cualquier otro panel de control] debe establecerse en utf8-gerneral-ci

2) debes cambiar tu hilo [Ex. textbox1.text] a byte, por lo tanto

2-1) define byte [] st2;

2-2) convierta su cadena [textbox1.text] a unicode [mmultibyte string] de la siguiente manera:

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

3) ejecuta este comando sql antes de cualquier consulta:

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

3-2) ahora debe insertar este valor en, por ejemplo, el campo nombre por:

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

4) el trabajo principal que muchas soluciones no le prestaron atención es la siguiente: debe usar addwithvalue en lugar de agregar el parámetro de comando como se muestra a continuación:

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

+++++++++++++++++++++++++++++++ disfruta de datos reales en tu servidor de base de datos en lugar de ????

  Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(mystring)); 

Utilice el siguiente fragmento de código para obtener bytes del archivo 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; } 

Llame al siguiente y guárdelo como un archivo adjunto

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