會員登入 新朋友?立刻註冊
[說明]
文章會慢慢移新精讚 //n.sfs.tw
2019/2/23 星期六     [文章分類及列表]
精讚Blog logo 部落格是自己寫爽的
精讚部落 > 後端程設 > C# 寫法
C# 從MySql latin1資料表取得的中文字是亂碼的 無次要群組 列印 推薦
作者或來源 瘦河馬 2010-03-10 13:36:30
關鍵字 1xml 2c#
此文完整連結 http://n.zipko.info/399.html
文章歡迎轉載,請尊重版權註明連結來源。

C# 從MySql latin1資料表取得的中文字是亂碼的處理

這個棘手的問題,我花了整整二天解決;MySQL 是在 FreeBSD 6.2 上。

用Console去Mysql中查詢latin1 的資料表,取得的中文字若由C# Select 出後,結果是亂碼!

資料庫 offline   校對    utf8_unicode_ci
     L資料表 conn_status  型態  MyISAM   校對    utf8_general_ci
            L  欄位 u_name      varchar(20)  校對    latin1_bin <===  注意
因為有中文的欄位,校對是 latin1_bin, 這個關鍵花了一天才找到。

由資料庫Select取出的字串是 instr 是個亂碼字串,我把亂碼字串轉成字元(char)陣列,再把字元陣列中每個字元拆開,先將字元轉成整數(0-65535),再分別取出高位和低位的整數值(0-255),接著將高低位互換位置後,再轉回bytes。

舉例而言,[22 44] [56] [6E 33] [FD 66] [23] ...... 是轉成字元的bytes,每個char 用中括號來區分。轉換高低位後產生:

[44 22] [56] [33 6E] [66 FD] [23] ......

在於Unicode 是1-2個char所組成,一個字元是由1-2位元byte組成,回傳的就是正確的UNICODE中文字,以下是我寫的轉換函式:

private string ConvertUnicode(string instr)
{
          char[] wdchars = instr.ToCharArray();
          byte[] resbyte = new byte[wdchars.Length*2 ];   //預設長度是 char 的二倍
           
          int ii = 0;
          foreach (char wdchar in wdchars)
          {
                int v = Convert.ToInt32(wdchar);    //先轉成整數
                if (v > 255)   //有二個 bytes 組成 char
                {
                    int hv = (int)(v / 256);  //高位元轉成整數
                    int lv = v % 256;   //低位元轉成整數

                    resbyte[ii] = Convert.ToByte(lv);  //低位元轉成 byte
                    resbyte[ii + 1] = Convert.ToByte(hv);  //高位元轉成 byte
                    //轉成16進位字串值,以下兩行可省略
                    //string hs = Convert.ToString(hv, 16).ToUpper().PadLeft(2, '0'); 
                    //string ls = Convert.ToString(lv, 16).ToUpper().PadLeft(2, '0');
                    ii += 2;
                }
                else   //只有一個 byte 組成 char
                {
                    string ls = Convert.ToString(v, 16).ToUpper().PadLeft(2, '0');
                    resbyte[ii] = Convert.ToByte(v);
                    ii++;
                }
          }
         return resbyte.toString();
}

後來發現,如果設定成這樣就可以解決上面的問題了
資料庫 utf8_bin
    L 資料表 utf8_bin
        L有中文的欄位 utf8_bin

END
F B 留 言 版

留言結束請重新整理網頁顯示留言
相 關 文 章
同 群 組 其 他 文 章
隨 機 文 章
精讚部落版權所有(c) JinZan Blog http://n.zipko.info Author axer@tc.edu.tw. 最佳瀏器為Firefox,本網頁不支援IE6。[文章分類及列表]
本站最佳瀏覽解析度1024x768 網站建置 2009.11