webForumDet fria alternativet

Convertera =?iso-8859-1?Q?H=E4jsan?=+

.NET

10 svar · 648 visningar · startad av Nickemannen

Medlem sedan aug. 20003 575 inlägg
Frågan#1

Hur gör jag om detta till häjsan ?

Medlem sedan juni 20022 599 inlägg
#2

Kodningen kallas quoted-printable. Om det finns nåt inbyggt stöd i .NET vet jag inte. Det borde iaf gå att hitta färdig kod om du söker lite.

Annars kan du köra "the hard way": De två första tecknen till höger om "=" är det hexadecimala asci-värdet för tecknet: E4(hexa)->228(decimalt)->ä.

Medlem sedan aug. 20003 575 inlägg
#3

Jo, men jag hämtar ett långt mail och det verkar som om

" tecknen gör om sig också :(.

Jag hittar ingenting på msdn där finns det bara för c/c++.

Och på google hittar jag inget användbart heller

Medlem sedan juni 20022 599 inlägg
#4

Nej. Det verkar vara rätt klurigt. Jag hittar heller inget vettigt heller för .NET (som är gratis).

Kanske leder dig på fel spår .. Men det känns ändå lite som om du får koda om själv.

Jag kollade som hastigast på C++-koden i det här projektet (metoden Decode i QuotedPrinted.cpp). I princip handlar det om att leta efter "="-tecken och koda om nästa två tecken som jag skrev ovan.

Men, som sagt, jag vet inte. Kanske finns nåt enklare ..? Andra borde ju haft samma problem, tycker man.

Medlem sedan aug. 20003 575 inlägg
#5

Jo, sant men nu vet jag iallfall vad jag är ute efter jag har försökt med en massa
Text.Enoding.GetEncoding("iso-8859-1")
på var enda byte nu vet jag vad jag skall leta efter. Så tack.

Hoppas verkligen det finns någion som gjort detta.

Jag tycker det är kasst att de inte lagt till detta i .NET iallfall.

Medlem sedan aug. 20003 575 inlägg
#6

http://www.codeproject.com/csharp/smtpemailer.asp?target=quoted-printable

i denna länken har någon påstått sig löst problemet men jag kan inte hitta var i hans kod där han har löst det

Medlem sedan aug. 20003 575 inlägg
#7
private string EncodeBodyAsQuotedPrintable()
		{
			StringBuilder buf = new StringBuilder();
			sbyte cur;
			for(int x = 0; x < body.Length; ++x)
			{
				cur = (sbyte) body[x];
				//is this a valid ascii character?
				if( ((cur >= 33) && (cur <= 60)) || ((cur >= 62) && (cur <= 126)) || (cur == '\r') || (cur == '\n') || (cur == '\t') || (cur == ' '))
				{
					buf.Append(body[x]);
				}
				else
				{
					buf.Append('=');
					buf.Append(((sbyte)((cur & 0xF0) >> 4)).ToString("X"));
					buf.Append(((sbyte) (cur & 0x0F)).ToString("X"));
				}
			}
			//format data so that lines don't end with spaces (if so, add a trailing '='), etc.
			//for more detail see RFC 2045.

			int start = 0;
			string enc = buf.ToString();
			buf.Length = 0;
			for(int x = 0; x < enc.Length; ++x)
			{
				cur = (sbyte) enc[x];
				if(cur == '\n' || cur == '\r' || x == (enc.Length - 1))
				{
					buf.Append(enc.Substring(start, x - start + 1));
					start = x + 1;
					continue;
				}
				if((x - start) > 76)
				{
					bool inWord = true;
					while(inWord)
					{
						inWord = (!char.IsWhiteSpace(enc, x) && enc[x-2] != '=');
						if(inWord)
						{
							--x;
							cur = (sbyte) enc[x];
						}
						if(x == start)
						{
							x = start + 76;
							break;
						}
					}
					buf.Append(enc.Substring(start, x - start + 1));
					buf.Append("=\r\n");
					start = x + 1;
				}
			}
			return buf.ToString();
		}

Denna hittade jag på sidan.

Medlem sedan juni 20022 599 inlägg
#8

Jag antar att åäö inte finns med i denna funktion heller.

Jo. I stora drag gör han så här:

1. Han kollar om tecknen tillhör det engelska alfabetet eller är carriage-return eller newline eller tab eller blank. I så fall lämnar han dem oförändrade.
2. Om det inte är något av dessa tecken så ersätter han med "="-tecknet + tecknets asciivärde hexadecimalt (två bytes).
3. Han loopar igenom alla rader och lägger på ett "="-tecken på alla rader som slutar med ett eller flera blanktecken.

Du skall alltså vända på detta och leta efter "="-tecken och hantera dem olika beroende på om de står vid en radbrytning, eller inte. Ett annat alternativ kunde ju vara att maila honom och fråga om han rent av har en DecodeBodyAsQuotedPrintable färdig?

Medlem sedan apr. 20012 266 inlägg
#9

För att dra upp en gammal tråd så har jag, tror jag, kommit fram till ett bra sätt att decoda QuotedPrintable.

string DecodeQP(MemoryStream stream, long pos, Encoding encoding)
{
MemoryStream decoded = new MemoryStream();

stream.Position = pos;
int b = stream.ReadByte();
while(b > -1)
{
	if ((char)b == '=' )
	{
		string hex = ((char)stream.ReadByte()).ToString() + ((char)stream.ReadByte()).ToString();
		decoded.WriteByte((byte)Convert.ToInt32(hex, 16));
	}
	else
	{
		decoded.WriteByte((byte)b);
	}
	b = stream.ReadByte();
}

decoded.Position = 0;
TextReader r = new StreamReader(decoded, encoding);
return r.ReadToEnd();
}

Har fungerat bra för mig, kom gärna med förslag på förbättringar eller error rapporter.

Medlem sedan aug. 20003 575 inlägg
#10

Såhär blev min slutgiltliga. Den som jag hittade på sidan var lite smådålig hehe

static string DecryptQuotedprintable(string strInput)
{
	strPattern = "=..";
	matches = Regex.Matches(strInput,strPattern);
	foreach(Match item in matches)
	{
		strInput = strInput.Replace(item.Value,AsciHextoChar(item.Value.Substring(1,item.Value.Length-1)));
}
	strInput = strInput.Replace("= ","\n");
	return strInput;
}
static string AsciHextoChar(string strHex)
{
	int n = 0;
	int intTemp = 0;
	string sHexTab = "0123456789ABCDEF";
	n = sHexTab.IndexOf(strHex.Substring(0,1));
	intTemp = (n)*16;
	n = sHexTab.IndexOf(strHex.Substring(1,1));
		intTemp = intTemp + (n);
	return Convert.ToChar(intTemp).ToString();
}
Medlem sedan mars 20002 836 inlägg
#11

Och så kontrar jag med lite VB-kod på hur min Decoder vart:

            Public Function DecodeBody(ByVal sData As String) As String
                Dim _pattern As String = "=.."
                Dim _regEx As New Regex(_pattern)
                Dim _match As Match

                For Each _match IN _regEx.Matches(sData)
                    Dim _tmp As String = _match.Value
                    sData = sData.Replace(_tmp, ASCIIHexToChar(_tmp.Substring(1,_tmp.Length - 1)))
                Next _match
                sData = sData.Replace("=" + ControlChars.Cr, "").Replace(ControlChars.CrLf, "")

                'sData = BreakLine(sData)

                Return sData
            End Function

            Public Function ASCIIHexToChar(ByVal sHexData As String) As String

                'If (sHexData = String.Empty OR sHexData.Length > 2) Then
                '    Throw New Exception("Argument longer than 2 characters - Argument = " + sHexData)
                'End If

                Dim n As Integer = 0
                Dim nTmp As Integer = 0
                Dim _hex As String = "0123456789ABCDEF"

                n = _hex.IndexOf(sHexData.Substring(0,1))

                    nTmp = n * 16
                n = _hex.IndexOf(sHexData.Substring(1,1))
                    nTmp = nTmp + n
                Try
                    Return Convert.ToChar(nTmp).ToString
                Catch
                    Return sHexData
                End Try
            End Function

Thx Nickemannen

cya,
/PatrikB

274 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
131 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)