使用Windows Ansi编码对URL进行编码

时间:2017-04-11 06:50:43

标签: c# .net url ftp

有ALT + 0174符号®(注册/保留)

的文件

http:/ftp.com/longname_®.png_thumbnail.jpg

我尝试使用

var pathToFile = "http://ftp.com/longname_®.png_thumbnail.jpg";
Html.Encode(pathToFile);
Html.Raw(Url.Encode(pathToFile));
我得到了 http%3a%2f%2fftp.com%2longname_%c2%ae.png_thumbnail.jpg,请注意%C2%AE

但有效网址为http%3a%2f%2fftp.com%2longname_%ae.png_thumbnail.jpg,请注意%AE

为什么?

1 个答案:

答案 0 :(得分:1)

使用用于文件名的Windows-1251 encoding上传文件。在Windows-1251中,®代码为AE

一般来说,这是错误的,您应该使用UTF-8编码重新上传文件。

如果无法重新上传,则必须使用Windows-1251文本编码实现URL编码。

可以有更简单的解决方案,但这应该做到:

const string filename = "longname_®.png_thumbnail.jpg";

// You can also use Encoding.Default, as that should return Windows-1251 on your machine,
// as you obviously have the 1251 set as the default legacy Ansi encoding.
Encoding encoding = Encoding.GetEncoding("Windows-1251");
byte[] bytes = encoding.GetBytes(filename);

string encoded = "";
for (int i = 0; i < bytes.Length; i++)
{
    char c = (char)bytes[i];
    if (c >= 0x80)
    {
        // URL-encode all characters in range 128-255
        encoded += Uri.HexEscape(c);
    }
    else
    {
        // URL-encode only reserved characters in range 0-127
        encoded += Uri.EscapeDataString(new string(c, 1));
    }
}

这会在longname_%AE.png_thumbnail.jpg中为您encoded