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?
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 ...
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);
}
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.
Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(mystring));
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 ????
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();