Diese Methode encodiert Zeichenfolgen: Urls,Dateinamen etc.
für die Übertragung im HttpHeader zur weiteren Verwendung
in einen Hexcodierten String, damit Sonder- und Leerzeichen so übertragen werden
das es beim Client "richtig" ankommt.
Beispiel: FileDownload mit Response.WriteFile
Dabei ist es möglich Dateien vom Filesystem per
Http an den Client zu übertragen und der Datei
einen Namen zugeben.
Dateiname auf dem System:
{7fcd1a85-d5c8-4419-a5e0-ee12b1ab2057}.zip
Gewünschter Name:
Überführungrichtlinie EU Neufahrzeuge.zip
Dazu fügt man dem Response.Header folgendes hinzu:
Response.AddHeader("Content-Disposition", "attachment; filename=Überführungrichtlinie EU Neufahrzeuge.zip");
Da der Dateiname jedoch Sonderzeichen / Leerzeichen enthält gibts Probleme beim Client,
im Dialog speichern erscheint: Überführungsrichtlinie_EU_Neufahrzeuge.zip
Auch UrlEncode hilft da nicht: Überführungsrichtlinie+EU+Neufahrzeuge.zip
Daher diese Methode ToHexEncodedString(string s)
"attachment; filename=" + ToHexEncodedString("Überführungrichtlinie EU Neufahrzeuge.zip");
wird zu %c3%9cberf%c3%bchrungrichtlinie%20EU%20Neufahrzeuge.zip
im speichern Dialog erscheint nun
Überführungrichtlinie EU Neufahrzeuge.zip
/// <summary>
/// Encodiert Sonderzeichen
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string ToHexEncodedString(string s)
{
System.Text.StringBuilder returnValue = new System.Text.StringBuilder();
System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding();
string reservedChars = "_+-=.,!'()@&$";
char[] chr = s.ToCharArray();
for (int i=0;i!=chr.Length; i++)
{
if (chr[i] <= 127 && (reservedChars.IndexOf(chr[i]) != -1 || char.IsLetterOrDigit(chr[i])))
returnValue.Append(chr[i]);
else
{
System.Text.StringBuilder encodedValue = new System.Text.StringBuilder();
byte[] encBytes = utf8.GetBytes(chr[i].ToString());
for (int j = 0; j != encBytes.Length; j++)
{
encodedValue.AppendFormat("%{0}", Convert.ToString(encBytes[j], 16));
}
returnValue.Append(encodedValue.ToString());
}
}
return returnValue.ToString();
}
1 Kommentare zum Snippet