none
dataGridView顯示從sybase數據庫取出來的中文字亂碼 RRS feed

  • 問題

  • 用dataGridView顯示從sybase數據庫取出來的中文字亂碼,英文和數字都正常,請問如何解決?

    sybase數據庫是公司別外一個軟件用的數據庫,我現在要從數據庫里面取數據出來給同事用.

    類似這樣的中文亂碼“Mizu 2ªX1¡║»Q¿¥▓µñ¯▒╝¼~└Y┼S 750ml x 2”

    OdbcConnection DbConnection = new OdbcConnection("PROVIDER=MSDASQL;DSN=Tendfame50; Uid=XXX; Pwd=XXX; Timeout = 600;charset=iso_1;");

    試過charset用Big5,GB2312,UTF8,ISO-1都不行,請問如何解決?


    2016年8月10日 上午 02:50

所有回覆

  • 如果資料庫內的資料原本的存法不是 Unicode,那只能先讀出來再轉碼。

    SQL Server 若是用 varchar 存 Unicode 資料也是只能這樣解。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2016年8月10日 上午 03:30
    版主
  • 謝謝您的回覆,請問如何轉碼呢?有相關參考資料嗎?
    2016年8月10日 上午 03:49
  • 轉碼就是用 Encoding.GetEncodings() 列出所有的編碼器,再一個一個試,看哪個轉碼器可以正確解出來,再用那個轉碼器去轉 (在不知道使用的編碼方式下)。

    若已經知道編碼方式,就直接用它轉碼就好了。

    ref: http://stackoverflow.com/questions/1922199/c-sharp-convert-string-from-utf-8-to-iso-8859-1-latin1-h


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2016年8月10日 上午 04:09
    版主
  • 剛剛在Sybase Interactive SQL運行 SELECT DB_PROPERTY( 'CharSet' ),看到charSet是cp850


    2016年8月10日 上午 04:28
  • 剛剛用Sybase Interactive SQL查了DB,里面的數據原來中文字就是亂碼.
    2016年8月10日 上午 04:45
  • 那就用 CP850 的編碼去解囉...

    只是如果原本就是亂碼的話,資料可能已經被破壞掉了,但還是可以先試看看。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure


    2016年8月10日 上午 05:31
    版主
  • 資料是正常,因為Sybase這個數據庫是別外一套系統正在用.

    請教如何解碼?有相關代碼嗎?

    2016年8月10日 上午 06:14
  • 前面已經給你了一個編碼轉換的討論連結了 (stackoverflow)。

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2016年8月10日 上午 06:29
    版主
  • 試了這個也不行.

     string str;

                str = dataGridView1.Rows[3].Cells[3].Value.ToString();

                     Encoding utf8 = Encoding.GetEncoding(850);
                Encoding gb2312 = Encoding.GetEncoding("gb2312");//Encoding.Default ,936
                byte[] temp = utf8.GetBytes(str);
                byte[] temp1 = Encoding.Convert(utf8, gb2312, temp);
                string result = gb2312.GetString(temp1);
                MessageBox.Show(result);

    2016年8月10日 上午 07:34
  • 那表示你的 Code Page 可能不是 850,一個一個試吧。

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2016年8月10日 上午 08:51
    版主
  • 如果該資料庫的連線字串或自訂的 連線類別 就沒提供轉碼方式,基本上就沒救了。

    在 .Net 只允許字串內保存 Unicode ,當你看到亂碼,就表示字串也是亂碼,沒辦法轉,在 .Net 保持原始編碼的只能使用 byte() ,不能經過字串跳轉。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年8月10日 下午 03:36