有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
。
为什么?
答案 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
。