簡體   English   中英

如何在 C# 中將字符串轉換為 UTF-8?

[英]How can I transform string to UTF-8 in C#?

我有一個從第三方應用程序收到的字符串,我想在 Windows Surface 上使用 C# 以任何語言正確顯示它。

由於編碼不正確,我的一段字符串在西班牙語中看起來像這樣:

Acción

而它應該是這樣的:

行動

根據這個問題的答案: 如何知道 C# 中的字符串編碼,我收到的編碼應該已經是 UTF-8 了,但它是在 Encoding.Default(可能是 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);

你們有什么其他的想法我可以嘗試嗎?

如您所知,字符串是作為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);

輸出應該看起來像

行動

day'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));

@anothershrubery 的答案對我有用。 我已經使用StringEntensions 類進行了增強,因此我可以輕松地在我的程序中轉換任何字符串。

方法:

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 數據庫,請執行以下操作:->

您的數據庫字段結構我 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);

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM