2017-04-11 43 views
1

沒有與ALT + 0174的符號文件上®(registred /預留)編碼URL

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,note %AE

爲什麼?

+0

'%AE'是'逃逸'功能的結果 '%C2%AE'是'encodeURI'的結果和結果 爲什麼期望'%AE'?看起來'%C2%AE'是好的結果,因爲escape方法已經被棄用了。 – tomaso

+0

AFAIK%c2表示''(帶有頂部重音的A)字符,正確編碼的URL可能是'http%3a%2f%2fftp.com%2flongname_%ae.png_thumbnail.jpg'。 –

+0

@tomaso僅適用於_%AE.png的ftp.com響應。 %CA%AE http404 –

回答

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)); 
    } 
} 

這將讓你在encodedlongname_%AE.png_thumbnail.jpg