none
使用Encoding.Convert讀取db中的utf8文字出現亂碼的問 RRS feed

  • 問題

  •  

    請問我的db中有utf8的值
    我要把他轉成c#看的到的文字
    以下是我的寫法
    我使用的是mysql 4版的
    用phpmyadmin看也是正確的utf8馬
    可是用C#讀卻是錯誤的錯誤的文字...>"<
    不知道是怎麼了
    可否告知呢?

    程式碼區塊
    for (int i = 0; i < dt.Rows.Count; i++)
    {
    byte[] b = Encoding.UTF8.GetBytes((string)dt.Rows[i][2]);
    byte[] c = Encoding.Convert(Encoding.UTF8, Encoding.Default, b);
    dt.Rows[i][2] = Encoding.Default.GetString(c);
    }

     

     

    2007年11月21日 上午 06:29

所有回覆

  • ...

    MySQL 的 utf8 指的是存在資料庫的內部編碼,並非是傳輸過程中的編碼,所以存取前後不需要額外編碼,而是在連線字串內指定傳輸編碼。

     

    這篇雖然有點舊了,不過我覺得你可以先看一下建立基本觀念:

    MySQL for Windows .Net

     

    2007年11月21日 上午 06:38
  • 不好意思

    我還是不懂..>"<

    我去爬了一些文看到有人在執行的時候設定成這各sql

    Character set 'utf8';

     

    SET NAMES utf8;

    SET CHARACTER_SET_CLIENT=utf8;

    SET CHARACTER_SET_RESULTS=utf8;

    這些

    可是我還是不能解決讀取出來變成亂碼的問題..

     

    2007年11月21日 上午 07:17
  • 你用哪個元件去連 MySQL ? MyODBC 只能用 big5 來傳輸。

     

    那個網址中,補充 2 也有說到:

    程式碼區塊

    2.連線端用跟 Server 端都用 utf8 ,也就是連線端不指定 SET NAMES 'big5' ,這樣 client 端的 MyODBC 送出去的文字會被轉成 big5 再當成英數轉 utf8 ,在 MySQL Query Browser 裡面看到的字就是 big5 當成英數顯示,也就是有規則的亂碼

    ...

    而 MySQL Query Browser 無法正確瀏覽,就表示另一種情況,這個資料庫不能跟其他應用程式交換資料。 MySQL Query Browser 是用 jdbc 連的,所以表示 jdbc 連線的應用程式都會讀成亂碼,未來新增或更新的模式也必須採用 1, 2 項方式處理,資料庫的存在並非是為了單一 client 端使用而設計,

    ...

     

    換句話說,你現在用 phpAdmin 看是正常的話,就表示你在 .Net 用 Character Set 'utf8' 會不正常,也就是上面那段的反義。
    2007年11月21日 上午 07:23
  •  

    不好意思忘了說我使用的元件

    我是使用mysql公司自己提供的元件

    至於幾版的

    我自己也忘了..>"<

    不知道是否要因為這樣而換掉元件呢?

    2007年11月21日 上午 07:27
  • ...

    MyODBC 也是 MySQL 提供的連線元件阿...

     

    你如果不會分,把資料庫連線字串那幾行程式碼貼出來。

     

    2007年11月21日 上午 07:29
  • 不好意思這是我後來有稍微改寫的

    不知道這樣足夠嗎?

    感謝您的熱心回答

    感激不禁

     

    程式碼區塊

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using MySql.Data.MySqlClient;

     

     

     

     public class Mysql_Connect
     {
      private string connStr;

      public Mysql_Connect(String Server_name,String User_id,String Password,String Database)
      {
       //
       // TODO: 在此加入建構函式的程式碼
       //
       connStr = String.Format("server={0};user id={1}; password={2}; database={3}; pooling=false;",
        Server_name, User_id, Password , Database);
      }
      public int ExcNonQuery(String sql)
      {
       try
       {
        //MessageBox.Show(connStr);
        MySqlConnection conn = new MySqlConnection( connStr );
        conn.Open();
        MySqlCommand cmd = new MySqlCommand(sql, conn);
        
        return cmd.ExecuteNonQuery();
       }
       catch (MySqlException ex)
       {
        MessageBox.Show("Failed to populate database list: " + ex.Message );
        return 0;
       }
      }
      public DataTable GetTable(String sql)
      {
       try
       {
                    MySqlConnection conn = new MySqlConnection(connStr);
        conn.Open();
                   

        DataTable data = new DataTable();

                    MySqlDataAdapter da = new MySqlDataAdapter("Character set 'big5';SET NAMES big5;SET CHARACTER_SET_CLIENT=big5;SET CHARACTER_SET_RESULTS=big5;", conn);
                    


        da = new MySqlDataAdapter(sql, conn );
        MySqlCommandBuilder cb = new MySqlCommandBuilder( da );

        da.Fill( data );
                    conn.Close();
        return data;
       }
       catch (MySqlException ex)
       {
                    return null;
       }
      }
            public bool Check_Connect()
            {
               
                try
                {
                    MySqlConnection conn = new MySqlConnection(connStr);
                    conn.Open();
                    conn.Close();
                    Console.WriteLine("連線中");
                    return true;
                }
                catch
                {
                    Console.WriteLine("斷線");
                    return false;
                }
            }
     }

     

     

    2007年11月21日 上午 07:33
  • using MySql.Data.MySqlClient;

     

    你是用 MySQL for .Net 來連線,這個據說新版 5.0 以後才支援 utf8 。

    http://dev.mysql.com/downloads/connector/net/5.0.html

     

    但是你要連結的是 4.1 ,4.1 是否能正確對應 5.0 就不知道了。

     

    你可以先用 VS2005 的伺服器總管連接 MySQL ,再去屬性抄他的連線字串來用,不用程式碼這邊一直改寫。

    2007年11月21日 上午 07:41
  •  

    原來我用的版本已經很舊了...>"<

    1.0.8.0的連線函式..

    我更新到5.0.8.1了

    不知道要如何才能讀取utf-8的碼

    還是說連db都要換成5.0的...>"<

    2007年11月21日 上午 08:09