web-dev-qa-db-fra.com

Comment puis-je transformer une chaîne en UTF-8 en C #?

J'ai une chaîne que je reçois d'une application tierce et j'aimerais l'afficher correctement dans n'importe quelle langue à l'aide de C # sur Windows Surface.

En raison d'un encodage incorrect, une partie de ma chaîne ressemble à ceci en espagnol:

Acción

alors que cela devrait ressembler à ceci:

Acción

Selon la réponse à cette question: Comment connaître l'encodage de chaîne en C # , l'encodage que je reçois devrait déjà arriver sur UTF-8, mais il est lu sur Encoding.Default (probablement ANSI?) .

J'essaie de transformer cette chaîne en véritable UTF-8, mais l'un des problèmes est que je ne peux voir qu'un sous-ensemble de la classe Encoding (propriétés UTF8 et Unicode uniquement), probablement parce que je suis limité à l'API Windows Surface.

J’ai essayé quelques extraits que j’ai trouvés sur Internet, mais aucun d’entre eux n’a encore porté ses fruits pour les langues orientales (c’est-à-dire le coréen). Un exemple est le suivant:

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

J'ai aussi essayé d'extraire la chaîne dans un tableau d'octets, puis d'utiliser 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);

Avez-vous d'autres idées que je pourrais essayer?

132
Gaara

Comme vous le savez, la chaîne arrive sous la forme Encoding.Default, vous pouvez simplement utiliser:

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

Une autre chose que vous devez vous rappeler peut-être: si vous utilisez Console.WriteLine pour générer certaines chaînes, vous devez également écrire Console.OutputEncoding = System.Text.Encoding.UTF8; !!! Ou toutes les chaînes utf8 seront sorties en tant que gbk ...

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

La sortie devrait ressembler à

Acción

day's affiche le jour

appelez 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

Votre code lit une séquence d'octets codés UTF8 et les décode à l'aide d'un codage à 8 bits.

Vous devez corriger ce code pour décoder les octets en UTF8.

Alternativement (pas idéal), vous pouvez reconvertir la chaîne incorrecte en tableau d'octets d'origine (en l'encodant à l'aide d'un encodage incorrect), puis décodez à nouveau les octets au format UTF8.

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

Si vous voulez sauvegarder une chaîne dans la base de données mysql, faites ceci: ->

La structure de votre champ de base de données i phpmyadmin [ou tout autre panneau de configuration] doit être définie sur utf8-gerneral-ci

2) vous devriez changer votre chaîne [Ex. textbox1.text] en octet, par conséquent

2-1) définir l'octet [] st2;

2-2) convertissez votre chaîne [textbox1.text] en unicode [chaîne multi-octets] par:

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

3) exécuter cette commande sql avant toute requête:

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

3-2) maintenant, vous devez insérer cette valeur dans par exemple le champ de nom par:

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

4) le travail principal auquel de nombreuses solutions n'ont pas prêté attention est la ligne ci-dessous: vous devez utiliser addwithvalue au lieu du paramètre de commande add in comme ci-dessous:

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

+++++++++++++++++++++++++++++++++++ Profitez de données réelles sur votre serveur de base de données au lieu de ????

5

Utilisez l'extrait de code ci-dessous pour obtenir des octets à partir d'un fichier 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;
    }

Appelez le ci-dessous et enregistrez-le en pièce jointe

           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