Feedback

ToHexEncodedString(string s) – Umlaute beim Dateidownload

Sprache: C#

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();
    }
/// <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 Kommentar