using System;
using System.Collections;
using System.Text;
/// <summary>
/// Class for encoding and decoding a string to QuotedPrintable
/// RFC 1521 http://www.ietf.org/rfc/rfc1521.txt
/// RFC 2045 http://www.ietf.org/rfc/rfc2045.txt
/// Date: 2006-03-23
/// Author: Kevin Spaun
/// Company: SPAUN Informationstechnik GmbH - http://www.spaun-it.com/
/// Feedback: kspaun@spaun-it.de
/// License: This piece of code comes with no guaranties. You can use it for whatever you want for free.
///
/// Modified by Will Huang ( http://blog.miniasp.com/post/2008/02/14/Quoted-Printable-Encoding-and-Decoding.aspx )
/// Modified at 2008-02-13
///
/// Modified by yongfa365 (http://www.yongfa365.com)
/// Modified at 2008-11-29
/// Modified for MySelf
///
/// </summary>
public class QuotedPrintable
{
private const byte EQUALS = 61;
private const byte CR = 13;
private const byte LF = 10;
private const byte SPACE = 32;
private const byte TAB = 9;
/// <summary>
/// Encodes a string to QuotedPrintable
/// </summary>
/// <param name="_ToEncode">String to encode</param>
/// <returns>QuotedPrintable encoded string</returns>
public static string Encode(string _ToEncode)
{
StringBuilder Encoded = new StringBuilder();
string hex = string.Empty;
//byte[] bytes = Encoding.Default.GetBytes(_ToEncode);
byte[] bytes = Encoding.UTF8.GetBytes(_ToEncode);
//int count = 0;
for (int i = 0; i < bytes.Length; i++)
{
//these characters must be encoded
if ((bytes[i] < 33 || bytes[i] > 126 || bytes[i] == EQUALS) && bytes[i] != CR && bytes[i] != LF && bytes[i] != SPACE)
{
if (bytes[i].ToString("X").Length < 2)
{
hex = "0" + bytes[i].ToString("X");
Encoded.Append("=" + hex);
}
else
{
hex = bytes[i].ToString("X");
Encoded.Append("=" + hex);
}
}
else
{
//check if index out of range
if ((i + 1) < bytes.Length)
{
//if TAB is at the end of the line - encode it!
if ((bytes[i] == TAB && bytes[i + 1] == LF) || (bytes[i] == TAB && bytes[i + 1] == CR))
{
Encoded.Append("=0" + bytes[i].ToString("X"));
}
//if SPACE is at the end of the line - encode it!
else if ((bytes[i] == SPACE && bytes[i + 1] == LF) || (bytes[i] == SPACE && bytes[i + 1] == CR))
{
Encoded.Append("=" + bytes[i].ToString("X"));
}
else
{
Encoded.Append(System.Convert.ToChar(bytes[i]));
}
}
else
{
Encoded.Append(System.Convert.ToChar(bytes[i]));
}
}
//if (count == 75)
//{
// Encoded.Append("=\r\n"); //insert soft-linebreak
// count = 0;
//}
//count++;
}
return Encoded.ToString();
}
/// <summary>
/// Decodes a QuotedPrintable encoded string
/// </summary>
/// <param name="_ToDecode">The encoded string to decode</param>
/// <returns>Decoded string</returns>
public static string Decode(string _ToDecode)
{
//remove soft-linebreaks first
//_ToDecode = _ToDecode.Replace("=\r\n", "");
char[] chars = _ToDecode.ToCharArray();
byte[] bytes = new byte[chars.Length];
int bytesCount = 0;
for (int i = 0; i < chars.Length; i++)
{
// if encoded character found decode it
if (chars[i] == '=')
{
bytes[bytesCount++] = System.Convert.ToByte(int.Parse(chars[i + 1].ToString() + chars[i + 2].ToString(), System.Globalization.NumberStyles.HexNumber));
i += 2;
}
else
{
bytes[bytesCount++] = System.Convert.ToByte(chars[i]);
}
}
//return System.Text.Encoding.Default.GetString(bytes, 0, bytesCount);
return System.Text.Encoding.UTF8.GetString(bytes, 0, bytesCount);
}
}
引用: C# 实现Quoted-Printable编码、解码http://www.yongfa365.com/item/Quoted-Printable-Encoding-Decoding-Encode-Decode.html
|
相关链接
|
|
| |
文章分类 |
|
|
|