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

Gaa*_*ara 138 c# string encoding utf-8 character-encoding

我有一个字符串,我从第三方应用程序收到,我想在我的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);     
Run Code Online (Sandbox Code Playgroud)

我也尝试将字符串解压缩为字节数组,然后使用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);
Run Code Online (Sandbox Code Playgroud)

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

ano*_*ery 236

如您所知,字符串即将进入,Encoding.Default您只需使用:

byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
Run Code Online (Sandbox Code Playgroud)

您可能需要记住的另一件事:如果您使用Console.WriteLine输出一些字符串,那么您也应该写Console.OutputEncoding = System.Text.Encoding.UTF8;!!! 或者所有utf8字符串都将作为gbk输出...

  • @Gaara:试试`Encoding.GetEncoding(...)`; 您需要找到在另一端错误使用的实际编码的名称. (3认同)
  • @guorongfei 前提是`myString`是mojibake。该代码首先撤消错误的解码,然后进行正确的解码。只要错误的解码没有丢失数据,它就可以工作。但正如 @SLaks 指出的那样,最好使用错误的确切编码。(代码中更好的名称和注释将有助于理解看起来非常错误的代码实际上是在尝试做正确的事情。) (2认同)

Met*_*Man 16

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);
Run Code Online (Sandbox Code Playgroud)

输出应该是这样的

行动组织

那天是显示日

调用DecodeFromUtf8();

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


SLa*_*aks 12

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

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

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


小智 6

@anothershrubery 的答案对我有用。我已经使用StringEntensions 类进行了增强,因此我可以轻松地在我的程序中转换任何字符串。

方法:

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

用法:

string myString = "Acción";
string strConverted = myString.ToUTF8();
Run Code Online (Sandbox Code Playgroud)

或者干脆:

string strConverted = "Acción".ToUTF8();
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

2)你应该改变你的字符串[例如 textbox1.text]到字节,因此

2-1)定义byte [] st2;

2-2)将你的字符串[textbox1.text]转换为unicode [mmultibyte string]:

byte[] st2 = System.Text.Encoding.UTF8.GetBytes(textBox1.Text);
Run Code Online (Sandbox Code Playgroud)

3)在任何查询之前执行此sql命令:

string mysql_query2 = "SET NAMES 'utf8'";
cmd.CommandText = mysql_query2;
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

3-2)现在您应该将此值插入到例如名称字段中:

cmd.CommandText = "INSERT INTO customer (`name`) values (@name)";
Run Code Online (Sandbox Code Playgroud)

4)许多解决方案没有注意的主要工作是以下行:你应该使用addwithvalue而不是添加命令参数如下:

cmd.Parameters.AddWithValue("@name",ut);
Run Code Online (Sandbox Code Playgroud)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++


小智 5

 Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(mystring));
Run Code Online (Sandbox Code Playgroud)