gb 2312符号化されたstringを復号する
3704 ワード
#region/* */
/// <summary>
///
/// </summary>
/// <param name="strSrc"> </param>
/// <returns> </returns>
private string deCode(string strSrc)
{
int start = strSrc.IndexOf("=?GB2312?");
if (start == -1)
{
start = strSrc.IndexOf("=?gb2312?");
}
if (start >= 0)
{
string strHead = strSrc.Substring(0, start);
string strMethod = strSrc.Substring(start + 9, 1);
strSrc = strSrc.Substring(start + 11);
int end = strSrc.IndexOf("?=");
if (end == -1)
{
end = strSrc.Length;
}
string strFoot = strSrc.Substring(end + 2, strSrc.Length - end - 2);
strSrc = strSrc.Substring(0, end);
if (strMethod == "B")
strSrc = strHead + deCodeB64(strSrc) + strFoot;
else
{
if (strMethod == "Q")
strSrc = strHead + QPUnEncryCode(strSrc) + strFoot;
else
strSrc = strHead + strSrc + strFoot;
}
start = strSrc.IndexOf("=?GB2312?");
if (start == -1)
{
start = strSrc.IndexOf("=?gb2312?");
}
if (start >= 0)
strSrc = deCode(strSrc);
}
return strSrc;
}
/*Base64 */
private string deCodeB64(string strSrc)
{
try
{
if (strSrc != "")
{
byte[] by = Convert.FromBase64String(strSrc);
strSrc = Encoding.Default.GetString(by);
}
}
catch (Exception ex)
{ return ex.ToString(); }
return strSrc;
}
#region quoted-printable
private string QPUnEncryCode(string source)
{
source = source.Replace("=\r
", "");
int len = source.Length;
string dest = string.Empty;
int i = 0;
while (i < len)
{
string temp = source.Substring(i, 1);
if (temp == "=")
{
int code = Convert.ToInt32(source.Substring(i + 1, 2), 16);
if (Convert.ToInt32(code.ToString(), 10) < 127)
{
dest += ((char)code).ToString();
i = i + 3;
}
else
{
dest += System.Text.Encoding.Default.GetString(new byte[] { Convert.ToByte(source.Substring(i + 1, 2), 16), Convert.ToByte(source.Substring(i + 4, 2), 16) });
i = i + 6;
}
}
else
{
dest += temp;
i++;
}
}
return dest;
}
#endregion
#endregion
-------------------------------------------------
メールの送受信時、添付ファイル名が中国語の場合、文字化けした原因は、送信された符号化と受信時の符号化が一致しないためである.例えば、送信時にはgb 2312で符号化する、受信時にはgb 2312の復号プログラムで復号する.