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

本文关键字:字符串 转换 UTF-8 | 更新日期: 2023-09-27 17:49:55

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

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

而它应该是这样的:

Acción

根据对这个问题的回答:如何知道C#中的字符串编码,我收到的编码应该已经是UTF-8,但它是在encoding.Default(可能是ANSI?(上读取的。

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

你们还有其他想法我可以试试吗?

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

正如您所知,字符串以Encoding.Default的形式输入,您可以简单地使用:

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

您可能需要记住的另一件事是:如果您使用Console.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);

输出应该看起来像

Acción

天™s显示器一天的

调用DecodeFromUtf8((;

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

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

您需要修复该代码才能将字节解码为UTF8。

或者(不理想(,您可以将坏字符串转换回原始字节数组—通过使用不正确的编码对其进行编码—然后将字节重新解码为UTF8。

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

@anthershrubery的回答对我很有用。我使用StringEntensions class进行了增强,这样我就可以轻松地转换程序中的任何字符串。

方法:

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

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

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

2( 您应该将字符串[Ex.textbox1.text]更改为字节,因此为

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而不是像下面这样的add-in命令参数:

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