【问题标题】:Storing Special Characters in Windows Azure Blob Metadata在 Windows Azure Blob 元数据中存储特殊字符
【发布时间】:2022-02-25 10:00:15
【问题描述】:

我有一个将图像存储在 Windows Azure Block Blob 中的应用程序。我正在向每个上传的 blob 添加元数据。元数据可能包含一些特殊字符。例如,注册商标符号 (®)。如何将此值添加到 Windows Azure 中的元数据?

目前,当我尝试上传使用此类特殊字符的文件时,我会收到 400(错误请求)错误。

谢谢!

【问题讨论】:

    标签: special-characters azure-storage


    【解决方案1】:

    您可以使用 HttpUtility 对字符串进行编码/解码:

    blob.Metadata["Description"] = HttpUtility.HtmlEncode(model.Description);
    Description = HttpUtility.HtmlDecode(blob.Metadata["Description"]);
    

    http://lvbernal.blogspot.com/2013/02/metadatos-de-azure-vs-caracteres.html

    【讨论】:

      【解决方案2】:

      blob 元数据中支持的字符必须是 ASCII 字符。要解决此问题,您可以转义字符串(百分比编码)、base64 编码等。

      【讨论】:

        【解决方案3】:

        HttpUtility.HtmlEncode 可能不起作用;如果 Unicode 字符在您的字符串中(即 ’),它将失败。到目前为止,我发现 Uri.EscapeDataString 确实可以处理这种边缘情况和其他情况。但是,有许多字符会被不必要地编码,例如空格 (' '=chr(32)=%20)。

        我映射了元数据不接受的非法 ascii 字符,并构建了它来恢复字符:

            static List<string> illegals = new List<string> { "%1", "%2", "%3", "%4", "%5", "%6", "%7", "%8", "%A", "%B", "%C", "%D", "%E", "%F", "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17", "%18", "%19", "%1A", "%1B", "%1C", "%1D", "%1E", "%1F", "%7F", "%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87", "%88", "%89", "%8A", "%8B", "%8C", "%8D", "%8E", "%8F", "%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97", "%98", "%99", "%9A", "%9B", "%9C", "%9D", "%9E", "%9F", "%A0", "%A1", "%A2", "%A3", "%A4", "%A5", "%A6", "%A7", "%A8", "%A9", "%AA", "%AB", "%AC", "%AD", "%AE", "%AF", "%B0", "%B1", "%B2", "%B3", "%B4", "%B5", "%B6", "%B7", "%B8", "%B9", "%BA", "%BB", "%BC", "%BD", "%BE", "%BF", "%C0", "%C1", "%C2", "%C3", "%C4", "%C5", "%C6", "%C7", "%C8", "%C9", "%CA", "%CB", "%CC", "%CD", "%CE", "%CF", "%D0", "%D1", "%D2", "%D3", "%D4", "%D5", "%D6", "%D7", "%D8", "%D9", "%DA", "%DB", "%DC", "%DD", "%DE", "%DF", "%E0", "%E1", "%E2", "%E3", "%E4", "%E5", "%E6", "%E7", "%E8", "%E9", "%EA", "%EB", "%EC", "%ED", "%EE", "%EF", "%F0", "%F1", "%F2", "%F3", "%F4", "%F5", "%F6", "%F7", "%F8", "%F9", "%FA", "%FB", "%FC", "%FD", "%FE" };
            private static string MetaDataEscape(string value)
            {
                //CDC%20Guideline%20for%20Prescribing%20Opioids%20Module%206%3A%20%0Ahttps%3A%2F%2Fwww.cdc.gov%2Fdrugoverdose%2Ftraining%2Fdosing%2F
                var x = HttpUtility.HtmlEncode(value);
        
                var sz = value.Trim();
                sz = Uri.EscapeDataString(sz);
        
                for (int i = 1; i < 255; i++)
                {
                    var hex = "%" + i.ToString("X");
                    if (!illegals.Contains(hex))
                    {
                        sz = sz.Replace(hex, Uri.UnescapeDataString(hex));
                    }
                }
        
                return sz;
            }
        

        结果是:

        • 之前 ==>“1080x1080 Facebook 图片”
        • Uri.EscapeDataString => “1080x1080%20Facebook%20Images”
        • 之后 => "1080x1080 Facebook 图片”

        我确信有一种更有效的方法,但对于我的需求来说,这个命中似乎可以忽略不计。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-22
          • 2014-10-15
          • 2021-06-29
          • 2023-03-26
          • 1970-01-01
          • 2017-09-16
          • 2019-03-08
          相关资源
          最近更新 更多