none
請教文字轉碼的問題 RRS feed

  • 問題

  • 請教  如何直接將文字字串轉成unicode呢

    我日前因讀取informix資料庫
    發生直接用dataadapter,然後用datagridview秀資料,結果中文顯示為亂碼
    (我的目的在windowform上秀出informix資料的中文)


    自已用streamwriter的方式把中文部分試寫在文字檔中
    Dim sw As New StreamWriter("Grid.txt", True, Encoding.GetEncoding("iso-8859-1"))

    這樣呢 文字檔就可以看到中文

    可是請問各位高手,我要如何將它轉成中文秀在datagridview上呢??
    ps 我是用vs2005
     
    先謝謝各位高手回答囉^^
    2007年1月24日 上午 05:30

解答

所有回覆

  • 下sql指令時把欄位轉成unicode就可以了

    例如

    SELECT CONVERT(nvarchar, 欄位),....... FROM TABLE

    2007年1月24日 上午 06:44
  • To MattLee

    我照您的方法試了

    可是不行呢

    丟出的訊息  如下

    System.Data.OdbcException:ERROR [42S22][informix ODBC Driver][Informix]Column (nvarchar) not found in any table in the query (or SLV is undefined)

    對了  我的資料在informix, 不是在mssql

     

    2007年1月24日 上午 07:10
  • INFORMIX它沒有Unicode的欄位型別

    所以建議是能夠把INFORMIX內的資料

    改成以Unicode編碼的資料

     

     

    2007年1月24日 上午 07:24
  • 請問是如何改呢?

    資料庫會更動很多嗎?

     

    因為用vb.net讀到中文就是亂碼

    所以想說用轉碼的方式看能不能解決

    2007年1月24日 上午 07:36
  • 資料庫的資料內容都要改為unicode編碼

    所以變動蠻多的

    不然就只有把datagridview的資料來源內的資料以迴圈方式

    一筆筆轉成unicode 這樣缺點是執行速度會變慢

    2007年1月24日 上午 07:44
  • 問題一:資料內容都要改成unicode編碼,是指資料要重新輸入嗎,還是說改資料庫語系設定?

    問題二:那可以請教  如何一筆筆轉unicode呢?

    非常感謝MattLee您的回答

    2007年1月24日 上午 07:53
  • 1.資料要重新輸入符合Unicode的資料

    2.你的dataadapter不是有產生一個資料集嗎

       您就修改資料集內每一筆資料的內容為Unicode的字

       修改方式可以參考

       http://msdn2.microsoft.com/zh-tw/library/system.text.encoding(VS.80).aspx

    2007年1月24日 上午 08:13
  • ????  ?????

    ?????=========

    ??????????  = =

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Try
                Dim strConn As String = Me.TextBox1.Text.Trim
                Dim str As String = "DSN=tudata01"
                Dim Conn As New Odbc.OdbcConnection(str)
                Dim da As New Odbc.OdbcDataAdapter(strConn, Conn)
                Dim ds As New DataSet
                da.Fill(ds)
                Dim dt As New DataTable
                Dim dr As DataRow
                dt.Columns.Add(New DataColumn("empid"))
                dt.Columns.Add(New DataColumn("empName"))
                Dim i As Integer = 1
                For i = 0 To ds.Tables(0).Rows.Count - 1
                    dr = dt.NewRow
                    dr(0) = ds.Tables(0).Rows(i).Item(1)'????
                    dr(1) = ASCIItoUnicode(ds.Tables(0).Rows(i).Item(1))'??? 

                    dt.Rows.Add(dr)
                    i += 1
                Next
                Me.DataGridView1.DataSource = dt

            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End Sub

     Function ASCIItoUnicode(ByVal str) As String
            'ASCII to Unicode
            Dim asciiString As String = str

            ' Create two different encodings.
            Dim ascii As Encoding = Encoding.ASCII
            Dim [unicode] As Encoding = Encoding.unicode

            ' Convert the string into a byte[].
            Dim asciiBytes As Byte() = ascii.GetBytes(asciiString)

            ' Perform the conversion from one encoding to the other.
            Dim unicodeBytes As Byte() = Encoding.Convert(ascii, [unicode], asciiBytes)

            ' Convert the new byte[] into a char[] and then into a string.
            ' This is a slightly different approach to converting to illustrate
            ' the use of GetCharCount/GetChars.
            Dim uChars([unicode].GetCharCount(unicodeBytes, 0, unicodeBytes.Length)) As Char
            [unicode].GetChars(unicodeBytes, 0, unicodeBytes.Length, uChars, 0)
            Dim unicodeString As New String(uChars)

            ' Display the strings created before and after the conversion.
            Console.WriteLine("Original string: {0}", unicodeString)
            Console.WriteLine("Ascii converted string: {0}", asciiString)

            Return unicodeString
        End Function

     

    ?   "§f¥Ã¥Í"  ??   "?f????"   ????????

    ??ascii ?? unicode ?????? 

    2007年1月24日 上午 08:44
  • 編輯過後  中文字就不見了

    所以我用引述的方式

    我從ascii 轉成ascii  這想法對嗎??

    ps我就是這裡試不出來= =

    (don't be a lot of "?"  ok)

    2007年1月24日 上午 08:56
  • 我沒在用 informax

    不過你的 encoding 應該用 big5

    ex.

    Dim big5 As Encoding = Encoding.GetEncoding("big5")

    你用 ASCII 轉的話,超過 128 的會全部被過濾掉... 所以只剩英數是理所當然的。

    用 big5 將無法保留大部分的日韓簡罕,你若是原先資料庫沒有這個問題,可以忽略不管,有這個問題,就要灌 Unicode 補完計畫(會跟 FrontPage 2003 CodePage=950 情況衝),可以多轉換 5 千餘字。

    不過我覺得這段程式碼是有問題的,因為在 .Net 內,所有的字串都必須為 Unicode ,若是你原先字串不為 Unicode ,只要在 Unicode 範圍外的部份,就會發生掉碼,且英數為 1 byte ,可能會變成別的奇怪的字。

    MySQL 可以用參數指定用 big5 傳,Infomix 沒在用,不知道,不過轉碼應該是要進 .Net 前就動,進了 .Net 後雖然可以再轉碼,不過通常已經不完整了。

    2007年1月24日 上午 10:19
    版主
  • 請問

    意思是說如果我硬要轉的話

    建議從big5轉成unicode

    還是unicode 到 big5。

    可是看起來呈現的結果還是一樣的

    §f¥Ã¥Í              ==>§f¥A¥I             

    ³¯ºaºÖ             ==>3¯oaoO             

    原本                ==>從big5轉成unicode

    ------------------------------------------------------------

    2007年1月25日 上午 02:20
  • 我不知道有沒有更快的方法,我自己有個比較慢的方法,以你這個範例為例,整理到我公開的函式庫去。

    §f¥Ã¥Í -> 呂永生
    ³¯ºaºÖ -> 陳榮福

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=6&Function=250

    原始碼請參閱基本條件內的連結。

    2007年1月25日 上午 03:56
    版主
  • 謝謝你呢。

    不過用您寫的module會比我原本的想法快一點

    (原本是說先匯出文字檔再讀它囉,沒辦法中的辦法了)

     

     

    2007年1月25日 上午 05:47