あまりなかったのでVisual C#サンプルソースをここに大公開!!
How to decode base64 and quated-printable string.
2013/3/28
そういえば、twitterで文字化け現象が起きてるそうな。
なんか最近やたらとこのページのアクセスが多かったのは、
やっぱりBASE64関係だったのか。
こういう意味でもコードの使用は自己責任でお願いします。
public static String DecodeMailString(String str){
try
{
if (str == null || str == "") return "";
// ?で区切り
// separate with "?"
String[] s = str.Split('?');
byte[] b;
String ret;
if (s.Length < 3)
{
// quatedなら少なくとも?は3つ
// this judge its normal string, if they dont hae ? at least 3.
return str;
}
if (s[2] == "B")
{
//Base64 encoding
b = System.Convert.FromBase64String(s[3]);
// s[1] specifies eincoding
string dec = System.Text.Encoding.GetEncoding(s[1]).GetString(b);
//if(s[4] != "=")
//{
// ret += s[4];
//}
// =?x2022-JP?B?の処理
ret = System.Text.RegularExpressions.Regex.Replace(str, @"""?=[?][^?]*[?][^?]*[?][^?]*[?]=""?", dec);
}
else if (s[2] == "Q")
{
// Quoted-printable // http://homepage1.nifty.com/glass/tom_neko/web/web_03.html#Q_encode
// sample:
// "=?utf-8?Q?=E8=8F=8A=E5=9C=B0_=E5=BA=83=E8=A1=8C?="
string target = s[3]; // =E8=8F=8A=E5=9C=B0_=E5=BA=83=E8=A1=8C
List b16 = new List();
Encoding enc;
try
{
enc = Encoding.GetEncoding(s[1]);
}
catch (Exception ex)
{
enc = Encoding.GetEncoding("UTF-8");
}
for (int i = 0; i < target.Length; i++)
{
if (target[i] == '=')
{
if (target.Length >= i + 2)
{
string hexStr = new string(target.ToCharArray(i + 1, 2));
b16.Add(System.Convert.ToByte(hexStr, 16));
i += 2;
}
else
{
break;
}
}
else if (target[i] == '_')
{
b16.AddRange(enc.GetBytes(" "));
}
else
{
}
}
string dec = enc.GetString(b16.ToArray());
ret = System.Text.RegularExpressions.Regex.Replace(str, @"""?=[?][^?]*[?][^?]*[?][^?]*[?]=""?", dec);
LogRotation.Log.WriteLine(LogRotation.Level.Information, "DecodeMailString", "Quoted-printable from: " + target + " , to:" + dec );
}
else
{
//throw new Exception("decode error : " + str);
return str;
}
return ret;
}
catch (Exception ex)
{
throw ex;
}
}
0 件のコメント:
コメントを投稿