Как преобразовать строку в 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 с реальными данными вместо неизвестных (??????????)