none
請教一個關於編碼的轉換 RRS feed

  • 問題

  • 大家好, 請問一個關於編碼的問題,

            Dim strName As String = "今天天氣很好"
            Dim strUtf7 As String = ""
            Dim mbyte As Byte() = System.Text.Encoding.GetEncoding("Big5").GetBytes(strtitle.ToCharArray)
            strUtf7 = System.Text.Encoding.UTF7.GetString(mbyte)
    

    如例中, 字串經由big5編碼, 再轉換成utf7,

    假設我只有strUtf7這個字串,

    要怎麼將字串還原呢?

    我原本以為將strutf7先用utf7轉換成byte(), 再由big5來GetString, 結果不行,

    先感謝大家的幫忙...

    2013年5月5日 下午 01:41

解答

  • 您好,

    請試一下, orgBig5 就是你要的!

    Dim strName As String = "今天天氣很好"
    Dim charName = strName.ToCharArray
    Dim mbyte As Byte() = Encoding.GetEncoding("Big5").GetBytes(charName)
    Dim strUtf7 As String = Encoding.UTF7.GetString(mbyte)
    Dim charUtf7_Incorrect As Char() = strUtf7.ToCharArray
    Dim byteBig_Correct(charUtf7_Incorrect.Length - 1) As Byte
    For i As Integer = 0 To charUtf7_Incorrect.Length - 1
    	byteBig_Correct(i) = Convert.ToByte(charUtf7_Incorrect(i))
    Next
    Dim orgBig5 As String = Encoding.GetEncoding("Big5").GetString(byteBig_Correct)
    關於Big5字串誤被直接轉成Utf7的問題


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



    • 已編輯 亂馬客 2013年5月8日 上午 03:07
    • 已標示為解答 ed0507 2013年5月8日 上午 03:50
    2013年5月8日 上午 02:30

所有回覆

  • 您好,

    有試過「Encoding.Convert 方法」嗎?


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年5月5日 下午 02:04
  • 感謝您的回答, Encoding.Convert我有試, 但試不出來,

    應該是說, 我不曉得轉換的順序,

    假設我只有strutf7這個字串,

    因為我知道這個字串是從utf7來,

            Dim mbyte2 As Byte() = Encoding.Convert(Encoding.UTF7, Encoding.UTF8, Encoding.UTF7.GetBytes(strutf7.ToCharArray))
            Dim strutf8 As String = Encoding.UTF8.GetString(mbyte2)
     

    但得到的strutf8, 不是原來的字串, 是順序有哪邊錯嗎?

     

    • 已編輯 ed0507 2013年5月5日 下午 03:37
    2013年5月5日 下午 03:34
  • 我測試結果非常正常啊

    	        Dim strutf7 As String = "ABDC"
    		Dim mbyte2 As Byte() = Encoding.Convert(Encoding.UTF7, Encoding.UTF8, Encoding.UTF7.GetBytes(strutf7.ToCharArray))
    		Dim strutf8 As String = Encoding.UTF8.GetString(mbyte2)
    		MessageBox.Show(strutf8)


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年5月6日 上午 03:00
    版主
  • 您好,

    請問您是要將utf7轉成utf8嗎? 還是轉到big5再轉回來呢? utf8有些轉成big5應該會變成?吧!

    在網路上有找到一篇相關的討論,您看是否對您有幫助,謝謝!

    Converting UTF8 to UTF7.. seems easy, but look inside please !


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年5月6日 上午 04:49
  • 您好, 我是用中文字, 中文的話還原會不正確, 不知是哪部份的順序有問題....感謝您....
    2013年5月6日 上午 08:01
  • 您好, 感謝您, 我是要轉回原本的字串就可以,

    Utf8或Big5都OK, 您的這篇連結我來試看看

    2013年5月6日 上午 08:08
  • 您好, 我是用中文字, 中文的話還原會不正確, 不知是哪部份的順序有問題....感謝您....

    該不會又是許功蓋...

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年5月6日 下午 12:09
    版主
  • 用 base64 會不會快一點?

    base64 很明確就是 4/3 倍,轉成 utf8 或是 utf7 放大倍率看遠東語系字數,字越多,放大的越多。

    2013年5月6日 下午 01:11
  • 不是許功蓋耶, 你可以跑跑看, 一般中文字就跑不出來了...
    2013年5月6日 下午 04:36
  • Dim strutf7 As String = "真的不是許功蓋"
    		Dim mbyte2 As Byte() = Encoding.Convert(Encoding.UTF7, Encoding.UTF8, Encoding.UTF7.GetBytes(strutf7.ToCharArray))
    		Dim strutf8 As String = Encoding.UTF8.GetString(mbyte2)
    		MessageBox.Show(strutf8)
    
    		strutf7 = "再來一個 Big5 許功蓋"
    		mbyte2 = Encoding.Convert(Encoding.GetEncoding(950), Encoding.UTF8, Encoding.GetEncoding(950).GetBytes(strutf7.ToCharArray))
    		strutf8 = Encoding.UTF8.GetString(mbyte2)
    		MessageBox.Show(strutf8)

    那所以我是見鬼了? 你要不要把你的完整程式碼與擷圖丟上來看看?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年5月6日 下午 05:32
    版主
  •  

           Dim strName As String = "今天天氣很好"
           
    Dim strUtf7 As String = ""
           
    Dim mbyte As Byte() = System.Text.Encoding.GetEncoding("Big5").GetBytes(strName.ToCharArray)
            strUtf7
    = System.Text.Encoding.UTF7.GetString(mbyte)

    程式碼如上

    應該是說我知道原本的字串是"今天天氣很好",

    然後被人用編碼改成 "¤µ¤Ñ¤Ñ®ð«Ü¦n"

    我試了一下, 發現這個字串 "¤µ¤Ñ¤Ñ®ð«Ü¦n" 是由

    System.Text.Encoding.GetEncoding("Big5").GetBytes("今天天氣很好".ToCharArray)

    轉來的, 也就是上面的 strutf7, 那我怎麼樣將字串 "¤µ¤Ñ¤Ñ®ð«Ü¦n",

    再變成"今天天氣很好"

    感謝您不麻煩的一直幫忙



    • 已編輯 ed0507 2013年5月7日 上午 05:40
    2013年5月7日 上午 04:47
  • 需要Convert才可以吧!

    Dim strName As String = "今天天氣很好"
            Dim strUtf7 As String = ""
            Dim mbyte As Byte() = System.Text.Encoding.GetEncoding("big5").GetBytes(strName.ToCharArray)
            strUtf7 = System.Text.Encoding.UTF7.GetString(System.Text.Encoding.Convert(Encoding.GetEncoding("big5"), Encoding.UTF7, mbyte))


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年5月7日 上午 05:24
  • 抱歉, 是我沒說清楚, 是原始字串是 "今天天氣很好",

    然後目的字串是 "¤µ¤Ñ¤Ñ®ð«Ü¦n",

    我當時是查出來,

    strutf7是我查出來的結果, 就是如下面程式,

           Dim strName As String = "今天天氣很好"
           
    Dim strUtf7 As String = ""
           
    Dim mbyte As Byte() = System.Text.Encoding.GetEncoding("Big5").GetBytes(strName.ToCharArray)
            strUtf7
    = System.Text.Encoding.UTF7.GetString(mbyte)

    我是想問說, strUtf7, 現在是 "¤µ¤Ñ¤Ñ®ð«Ü¦n",

    我要怎麼把strUtf7 (就是這段字  "¤µ¤Ñ¤Ñ®ð«Ü¦n")  還原成 "今天天氣很好"?

    說得不清楚, 造成麻煩, 還請見諒

    2013年5月7日 上午 07:35
  • 我不覺得這是合理的用法, 畢竟你用 Big5 去取得字串的 Byte 陣列編碼, 又用 UTF7 編碼將 Byte 陣列還原成字串

    中文有這麼多字, 猜想要掉碼是一定跑不掉的, 只要中間掉一個碼, 就全盤亂掉了.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年5月7日 上午 09:26
    版主
  • 請使用 Base64 來傳 byte[],不要直接轉,否則以後光是掉碼就夠你受的了...

    強力監督SQL Injection問題!!

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

    2013年5月7日 上午 09:32
    版主
  • 感謝以上兩位說明, 因為轉碼的不是我,
    我就只有兩個字串, 一個是"今天天氣很好", 一個是 "¤µ¤Ñ¤Ñ®ð«Ü¦n",
    因為有人提出這個字串是如何轉的,
    所以上面那段轉法, 是我推算出來的,

    我後來問了一下, 因為有朋友將影片放在SkyDrive,
    影片的資訊, 像Title是中文,
    但是當用 Live SDK取出時, 字碼是亂的,
    也就是標題是"今天天氣很好", 但取出的標題是 "¤µ¤Ñ¤Ñ®ð«Ü¦n",
    因此在思考怎麼把碼轉回去,
    若是問Live SDK, 應該要發在別區,
    所以只在本區問編碼的方法, 看有沒有什麼方法可以把字再轉回來

    2013年5月7日 上午 10:50
  • 2013年5月7日 下午 12:12
  • 您好,

    請試一下, orgBig5 就是你要的!

    Dim strName As String = "今天天氣很好"
    Dim charName = strName.ToCharArray
    Dim mbyte As Byte() = Encoding.GetEncoding("Big5").GetBytes(charName)
    Dim strUtf7 As String = Encoding.UTF7.GetString(mbyte)
    Dim charUtf7_Incorrect As Char() = strUtf7.ToCharArray
    Dim byteBig_Correct(charUtf7_Incorrect.Length - 1) As Byte
    For i As Integer = 0 To charUtf7_Incorrect.Length - 1
    	byteBig_Correct(i) = Convert.ToByte(charUtf7_Incorrect(i))
    Next
    Dim orgBig5 As String = Encoding.GetEncoding("Big5").GetString(byteBig_Correct)
    關於Big5字串誤被直接轉成Utf7的問題


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



    • 已編輯 亂馬客 2013年5月8日 上午 03:07
    • 已標示為解答 ed0507 2013年5月8日 上午 03:50
    2013年5月8日 上午 02:30
  • 感謝您, 這是正確方法, 真厲害,

    Dim byteBig_Correct(charUtf7_Incorrect.Length - 1) As Byte
    For i As Integer = 0 To charUtf7_Incorrect.Length - 1
    byteBig_Correct
    (i) = Convert.ToByte(charUtf7_Incorrect(i))
    Next

    我原本是用

    Dim byteBig_Correct() As Byte = System.Text.Encoding.UTF7.GetBytes(strUtf7.ToCharArray)

    看起來好像差不多, 結果差蠻多的~~~
    感謝您, 真的很感謝

    2013年5月8日 上午 03:50