web-dev-qa-db-ja.com

C#で文字列をUTF-8に変換する方法を教えてください。

サードパーティのアプリから受け取った文字列があります。WindowsSurfaceでC#を使用して、どの言語でも正しく表示したいのですが。

誤ったエンコーディングのため、私の文字列の一部はスペイン語で次のようになります。

アッチャン

一方、それはこのように見えるはずです:

アシオン

この質問に対する回答によると、 C#で文字列エンコーディングを知る方法 、私が受け取っているエンコーディングはすでにUTF-8になっているはずですが、 Encoding.Default(おそらくANSI?)で読み取られます。

この文字列を実際のUTF-8に変換しようとしていますが、問題の1つは、Encodingクラスのサブセット(UTF8およびUnicodeプロパティのみ)しか表示されないことです。

私はインターネットで見つけたスニペットをいくつか試しましたが、東の言語(つまり韓国語)でこれまで成功したことが証明されたものはありません。一例は次のとおりです。

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

他にも私が試してみたいアイデアがありますか。

128
Gaara

文字列がEncoding.Defaultとして入ってきていることをご存知のとおり、単に使用することができます。

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

覚えておく必要があるかもしれないもう一つのこと:あなたがいくつかの文字列を出力するためにConsole.WriteLineを使っているならば、あなたはConsole.OutputEncoding = System.Text.Encoding.UTF8;を書くべきですまたは、すべてのutf8文字列がgbkとして出力されます。

221
anothershrubery
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);
}
16
MethodMan

あなたのコードはUTF8でエンコードされたバイトのシーケンスを読み込み、8ビットのエンコードを使ってそれらをデコードしています。

あなたはそのコードを修正してバイトをUTF8としてデコードする必要があります。

別の方法として、(理想的でない)、間違ったエンコーディングを使用してエンコーディングして、不正な文字列を元のバイト配列に戻すことができます。 UTF8としてのバイト数.

12
SLaks
 Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(mystring));
5
Riadh Hammouda

あなたがmysqlデータベースに任意の文字列を保存したい場合は、これを行います - >

データベースのフィールド構造i phpmyadmin [またはその他のコントロールパネル]をutf8-gerneral-ciに設定します。

2)あなたはあなたの弦を変更するべきです。 textbox1.text]をバイト、そのため

2-1)byte [] st2を定義します。

2-2)文字列[textbox1.text]を次のようにしてユニコード[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)これで、例えばnameフィールドにこの値を挿入する必要があります。

cmd.CommandText = "INSERT INTO customer (`name`) values (@name)";

4)多くの解決策がそれに注意を向けなかった主な仕事は以下の行です:あなたは以下のようなコマンドパラメータにaddの代わりに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();
3
jAntoni