Как преобразовать строку в UTF-8 в С#?

У меня есть строка, которую я получаю от стороннего приложения, и я хотел бы правильно ее отображать на любом языке, используя С# на моей Windows-поверхности.

Из-за неправильной кодировки часть моей строки выглядит по-испански:

Acción

тогда как это должно выглядеть так:

Acción

В соответствии с ответом на этот вопрос:  Как узнать строковое кодирование в С#, кодировка, которую я получаю, должна поступать уже на UTF-8, но она читается на Encoding.Default(возможно, ANSI?).

Я пытаюсь преобразовать эту строку в настоящий UTF-8, но одна из проблем заключается в том, что я могу видеть только подмножество класса Encoding (только для свойств UTF8 и Unicode), вероятно, потому, что я ограничен окнами API поверхности.

Я пробовал некоторые фрагменты, которые я нашел в Интернете, но ни один из них пока не доказал свою эффективность для восточных языков (например, корейский). Один из примеров:

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

Я также попытался извлечь строку в массив байтов, а затем использовать 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);

У вас есть другие идеи, которые я мог бы попробовать?

Ответ 1

Как вы знаете, строка входит как Encoding.Default, вы можете просто использовать:

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

Еще одна вещь, которую вам, возможно, придется помнить: если вы используете Console.WriteLine для вывода некоторых строк, тогда вы также должны написать Console.OutputEncoding = System.Text.Encoding.UTF8;!!! Или все строки utf8 будут выводиться как gbk...

Ответ 2

Ваш код читает последовательность байтов в кодировке UTF8 и декодирует их с использованием 8-разрядной кодировки.

Вам нужно исправить этот код, чтобы декодировать байты как UTF8.

В качестве альтернативы (не идеально) вы можете преобразовать неверную строку обратно в исходный массив байтов — путем ее кодирования с использованием неправильной кодировки &mdash, а затем повторно декодировать байты как UTF8.

Ответ 3

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

//Выход должен выглядеть как

Acción

дневные дисплеи Дэй

вызов DecodeFromUtf8();

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

Ответ 4

Если вы хотите сохранить любую строку в базе данных mysql, сделайте следующее: →

Структура поля базы данных я phpmyadmin [или любая другая панель управления] должна быть установлена ​​в utf8-gerneral-ci

2) вы должны изменить строку [Ex., поэтому

2-1) определить байт [] st2;

2-2) преобразуйте вашу строку [textbox1.text] в unicode [mmultibyte string]:

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

3) выполните эту команду sql перед любым запросом:

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

3-2) теперь вы должны вставить это значение в, например, в поле имени:

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

4) основная работа, на которую многие решения не обращали внимания, - это нижняя строка:  вы должны использовать addwithvalue вместо добавления в параметр команды, как показано ниже:

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

++++++++++++++++++++++++++++++++++ получать реальные данные на сервере базы данных вместо <? >

Ответ 5

Используйте приведенный ниже фрагмент кода для получения байтов из файла 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;
    }

Позвоните ниже и сохраните его как вложение

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

Ответ 6

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

Ответ 7

Попробуйте следующее:

String.Format("N'{0}'", myString);

Я использую этот код для сохранения данных в SQL с реальными данными вместо неизвестных (??????????)