Feedback

C# - ToHexEncodedString(string s) - Umlaute beim Dateidownload

Veröffentlicht von am 04.11.2006
(3 Bewertungen)
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();
    }
Abgelegt unter RFC 2396, Umlaute, Encodierung, HttpHeader.

1 Kommentare zum Snippet

Adivera schrieb am 01.10.2007:
Danke :-). Genau dass was ich gesucht habe. Wieso ist das eigentlich nicht fix im .net Framework drin ?

Gruss Roberto
 

Logge dich ein, um hier zu kommentieren!