Fonction qpdecode

Contenu du snippet

Fonction permettant de décoder du texte UTF8 encodé en quote-printable (format courrant pour les mails, par exemple).

Source / Exemple :


#region Méthodes de convertions pour quote-printed decoder

		/// <summary>
		/// Permet de décoder une chaine de caractères quote-printabled en chaine de caractères standards.
		/// </summary>
		/// <param name="QuotedPrintString">La chaine à convertir</param>
		/// <returns>La chaine convertie.</returns>
		public static string QPDecode(string QuotedPrintString)
		{
			try
			{
				string _start = QuotedPrintString;
				string _res = "";
				while(_start.IndexOf('=') > -1)
				{
					string _aRemplacer = _start.Substring(_start.IndexOf('='), 6);
					string _nouveauCaractere = QPDecodeCoupleHexa(_aRemplacer);
					
					_res = _start.Substring(0, _start.IndexOf('=')) + _nouveauCaractere;
					_start = _start.Substring(_start.IndexOf('=') + 6);
				}
				return _res + _start;
			}
			catch(Exception ex)
			{
				return ex.Message;
			}
		}

		/// <summary>
		/// Permet de décoder un couple de caractères hexa. Par exemple, décode "=C3=A9" en 'é'.
		/// </summary>
		/// <param name="_stringADecoder">La chaine de caractères contenant un couple de valeurs hexa.</param>
		/// <returns>La valeur en caractères standards du couplet hexa passé en paramètre d'entrée.</returns>
		private static string QPDecodeCoupleHexa(string _stringADecoder)
		{
			char _c1 = (char) ConvertToInt(_stringADecoder.Substring(1, 2));
			char _c2 = (char) ConvertToInt(_stringADecoder.Substring(4, 2));

			Encoding iso = Encoding.GetEncoding("iso8859-1");
			Encoding unicode = Encoding.UTF8;
			byte[] isoBytes = iso.GetBytes(_c1.ToString() + _c2.ToString());
			return unicode.GetString(isoBytes);
		}

		/// <summary>
		/// Convertit une valeur Hexa en entier. "C3" devient par exemple 192.
		/// </summary>
		/// <param name="_stringAConvertir">La chaine à convertir.</param>
		/// <returns>La valeur équivalente, sous la forme d'un entier.</returns>
		private static int ConvertToInt(string _stringAConvertir)
		{
			return ConvertHexaToInt(_stringAConvertir[0]) * 16 + ConvertHexaToInt(_stringAConvertir[1]);
		}

		/// <summary>
		/// Convertir un caractère en entier. 'A' devient par exemple 10.
		/// </summary>
		/// <param name="_caractereAConvertir">Le caractère à convertir.</param>
		/// <returns>La valeur entière correspondant à la valeur hexa.</returns>
		private static int ConvertHexaToInt(char _caractereAConvertir)
		{
			if(char.IsNumber(_caractereAConvertir))
				return int.Parse(_caractereAConvertir + "");
			if(_caractereAConvertir == 'A') return 10;
			if(_caractereAConvertir == 'B') return 11;
			if(_caractereAConvertir == 'C') return 12;
			if(_caractereAConvertir == 'D') return 13;
			if(_caractereAConvertir == 'E') return 14;
			if(_caractereAConvertir == 'F') return 15;
			return 0;
		}

		#endregion

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.