[.NET]關於Big5字串誤被直接轉成Utf7的問題

[.NET]關於Big5字串誤被直接轉成Utf7的問題

最近有網友在論談上問到關於「一個關於編碼的轉換」。

他透過Live SDK取得影片的標題,原本是「今天天氣很好」,但是取出的標題卻是「¤µ¤Ñ¤Ñ®ð«Ü¦n」。

這朋友很利害,推算出為何「今天天氣很好」會變成「¤µ¤Ñ¤Ñ®ð«Ü¦n」,如下的Code,

VB.NET

'請先Imports System.Text
Dim strName As String = "今天天氣很好"
Dim mbyte As Byte() = Encoding.GetEncoding("Big5").GetBytes(strName.ToCharArray)
'strUtf7的值就是¤µ¤Ñ¤Ñ®ð«Ü¦n
Dim strUtf7 As String = Encoding.UTF7.GetString(mbyte)

 

C#

//請先using System.Text;
string strName = "今天天氣很好";
byte[] mbyte = Encoding.GetEncoding("Big5").GetBytes(strName.ToCharArray());
//strUtf7的值就是¤µ¤Ñ¤Ñ®ð«Ü¦n
string strUtf7 = Encoding.UTF7.GetString(mbyte);

 

知道了如何造成的原因,那我們就可以回推出來解決的方式!

即然「¤µ¤Ñ¤Ñ®ð«Ü¦n」是因為big5直接轉成Utf7而沒有經過轉換(要轉換可透過Encoding.Convert),所以它應該就還是Big5。

所以就可以取得strUtf7.ToCharArray再回成Big5的ByteArray,然後再透過Encoding.GetEncoding("Big5").GetString取回Big5的字串即可,如下,

VB.NET

'請先Imports System.Text
Dim strName As String = "今天天氣很好"
Dim charName = strName.ToCharArray
Dim mbyte As Byte() = Encoding.GetEncoding("Big5").GetBytes(charName)
'strUtf7的值就是¤µ¤Ñ¤Ñ®ð«Ü¦n
Dim strUtf7 As String = Encoding.UTF7.GetString(mbyte)
'取得strUtf7.ToCharArray 實際上它是Big5 Byte Array
Dim charUtf7_Incorrect As Char() = strUtf7.ToCharArray
'定義big5的Byte Array
Dim byteBig_Correct(charUtf7_Incorrect.Length - 1) As Byte
'將值設定回big5的Byte Array
For i As Integer = 0 To charUtf7_Incorrect.Length - 1
	byteBig_Correct(i) = Convert.ToByte(charUtf7_Incorrect(i))
Next
'取回Big5的字串,就是「今天天氣很好」
Dim orgBig5 As String = Encoding.GetEncoding("Big5").GetString(byteBig_Correct)

 

C#

//請先using System.Text;
string strName = "今天天氣很好";
var charName = strName.ToCharArray();
byte[] mbyte = Encoding.GetEncoding("Big5").GetBytes(charName);
//strUtf7的值就是¤µ¤Ñ¤Ñ®ð«Ü¦n
string strUtf7 = Encoding.UTF7.GetString(mbyte);
//取得strUtf7.ToCharArray 實際上它是Big5 Byte Array
char[] charUtf7_Incorrect = strUtf7.ToCharArray();
//定義big5的Byte Array
byte[] byteBig_Correct = new byte[charUtf7_Incorrect.Length];
//將值設定回big5的Byte Array
for (int i = 0; i <= charUtf7_Incorrect.Length - 1; i++)
{
	byteBig_Correct[i] = Convert.ToByte(charUtf7_Incorrect[i]);
}
//取回Big5的字串,就是「今天天氣很好」
string orgBig5 = Encoding.GetEncoding("Big5").GetString(byteBig_Correct);

 

image

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^