如何在 C # 中将字符串转换为 UTF-8?

我有一个字符串,我从第三方应用程序收到,我想显示它在任何语言使用 C # 在我的 Windows 平台上正确。

由于编码不正确,我的一段字符串在西班牙语中是这样的:

(意大利语)

而它应该是这样的:

行动

根据这个问题的答案: 如何知道 C # 中的字符串编码,我接收到的编码应该已经在 UTF-8上了,但是它是在 Encoding 上读取的。默认值(可能是 ANSI?).

我试图将这个字符串转换成真正的 UTF-8,但是其中一个问题是我只能看到 Encoding 类的一个子集(仅仅是 UTF8和 Unicode 属性) ,这可能是因为我仅限于使用 Windows Surface 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);

你们还有什么别的办法可以让我试试吗?

560657 次浏览

您的代码正在读取 UTF8编码的字节序列,并使用8位编码对它们进行解码。

您需要修复该代码,以便将字节解码为 UTF8。

或者(不太理想) ,您可以通过使用不正确的编码方式将错误的字符串转换回原来的字节数组 & mash; ,然后将字节重新解码为 UTF8。

正如你所知道的,字符串是以 Encoding.Default的形式进入的,你可以简单地使用:

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

另一件你可能要记住的事情: 如果你使用控制台。WriteLine 输出一些字符串,那么你也应该写 Console.OutputEncoding = System.Text.Encoding.UTF8;! ! !或者所有 utf8字符串将被输出为 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);

输出应该是这样的

行动

白天显示 白天

调用 DecodeFromUtf8() ;

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

如果您想将任何字符串保存到 mysql 数据库,请执行以下操作:->

您的数据库字段结构 i phpmyadmin [或任何其他控制面板]应设置为 utf8-general-ci

2)你应该把你的字符串[ Ex. textbox1.text ]改为 byte,因此

2-1)定义 byte [] 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);

++++++++++++++++++++++++++++++++++ 在您的数据库服务器中享受真实的数据,而不是? ? ?

使用下面的代码片段从 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();
 Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(mystring));

@ 另一个灌木丛般的答案对我起作用。我使用 字符串延伸类做了一个增强,这样我就可以轻松地在我的程序中转换任何字符串。

方法:

public static class StringExtensions
{
public static string ToUTF8(this string text)
{
return Encoding.UTF8.GetString(Encoding.Default.GetBytes(text));
}
}

用法:

string myString = "Acción";
string strConverted = myString.ToUTF8();

或者简单地说:

string strConverted = "Acción".ToUTF8();