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

如何在C#中将字符串转换为UTF-8?,c#,string,encoding,utf-8,character-encoding,C#,String,Encoding,Utf 8,Character Encoding,我有一个从第三方应用程序收到的字符串,我希望在我的Windows界面上使用C#以任何语言正确显示它 由于编码不正确,我的字符串中有一段在西班牙语中如下所示: AcciÃn 而它应该是这样的: 阿克松 根据对这一问题的答复: ,我收到的编码应该已经在UTF-8上了,但是它是在encoding.Default(可能是ANSI?)上读取的 我试图将这个字符串转换成真正的UTF-8,但问题之一是我只能看到编码类的子集(仅限UTF8和Unicode属性),可能是因为我仅限于windows surface

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

由于编码不正确,我的字符串中有一段在西班牙语中如下所示:

AcciÃn

而它应该是这样的:

阿克松

根据对这一问题的答复: ,我收到的编码应该已经在UTF-8上了,但是它是在encoding.Default(可能是ANSI?)上读取的

我试图将这个字符串转换成真正的UTF-8,但问题之一是我只能看到编码类的子集(仅限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);
byte[]myByteArray=新字节[myString.Length];
for(intix=0;ix

你们还有其他想法吗?

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

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


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

正如您所知,该字符串将作为
编码。默认值
您只需使用:

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

另一件事您可能必须记住:如果您使用Console.WriteLine输出一些字符串,那么您还应该编写
Console.outpunecoding=System.Text.Encoding.UTF8!!!或者,所有utf8字符串都将作为gbk输出…

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

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);
数据库字段结构i phpmyadmin[或任何其他控制面板]应设置为utf8 gerneral ci

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

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);
++++++++++++++++++++++++++++++++++
享受数据库服务器中的真实数据,而不是???

使用下面的代码片段从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();

@另一个草率的回答对我有效。我已经使用做了一个增强,所以我可以轻松地转换程序中的任何字符串

方法:

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

您的问题首先来自于创建字符串(来自流或字节[])的代码。请显示该代码。@Oded:.Net字符串作为UTF16存储在内存中,但
编码。默认值
返回系统的ANSI代码页。下面是一个字符串示例,该字符串在英语中不起作用:我的前端应用程序显示的不是日期,而是日期™这也行得通,实际上比我的答案好得多,我给你一个+1的好答案,谢谢!问题是,正如我在描述中提到的,surface的API不完整(没有编码。默认值对我可用)。@Gaara:Try
Encoding.GetEncoding(…)
;您需要找到另一端错误使用的实际编码的名称。您能解释一下为什么这样做吗?如果默认值为GB2312,则Encoding.Default.GetBytes将使用GB2312编码器对字符串到字节数组进行编码,然后Encoding.UTF8.GetString将尝试使用UTF8解码器对字节数组进行解码,结果应该是错误的,但为什么这样做有效@anothershrubery@guorongfei前提是
myString
是mojibake。代码首先撤消错误的解码,然后执行正确的解码。只要错误的解码没有丢失数据,它就可以工作。但正如@SLaks所指出的,最好使用错误的精确编码。(代码中更好的名称和注释将有助于理解看起来非常错误的代码实际上是如何试图做正确的事情。)谢谢!它在西班牙语中确实有效,但问题是同样的语言在东方语言(即韩语)中不起作用。我正试图在互联网上寻找一种8位到UTF-8的转换算法,但仍然没有成功。下面是一个字符串的例子,它在英语语言中不起作用:我的前端应用程序没有显示日期,而是显示:day€™sok让我来处理它,看看我能想出什么我测试了,它返回了day's我将粘贴我测试的静态方法它实际上与@anothershrubery提供的相同你可以通过传递DecodeFromUtf8(string utf8string)来更改该方法;谢谢问题是第三方应用程序是C++,而我的代码是C语言,所以我猜解码发生在这两个之间的“桥梁”中。
string myString = "Acción";
string strConverted = myString.ToUTF8();
string strConverted = "Acción".ToUTF8();