【问题标题】:Encode URL using Windows Ansi encoding使用 Windows Ansi 编码对 URL 进行编码
【发布时间】:2017-04-11 06:50:43
【问题描述】:

上面有带有 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

为什么?

【问题讨论】:

  • %AEescape 函数的结果 %C2%AEencodeURI 的结果 为什么你期望 %AE?看来%C2%AE 是一个不错的结果,因为转义方法已被弃用。
  • 所以客户端不使用UTF。作为乌克兰语,它可能是 Windows-1251,这就是为什么保留了西里尔字母,而没有保留汉字。它最有可能使用您的旧 Ansi 编码。您还可以看到,每个西里尔字母只有一个 %XX,而如果使用 UTF-8,将会有更多。服务器对OPTS UTF8 ON的响应是什么?
  • 再次尝试在 Total Commander 中强制使用 UTF-8:Net > FTP Connect > New connection > Advanced > Encoding of file names > UTF-8
  • 看起来不错。那么现在 ftp.com 为这些文件提供了什么 URL?
  • 所以其他软件上传不正确。虽然您可以通过在 Windows-1251 编码中生成 URL 来解决此问题,但一旦文件包含 Windows-1251 编码中不存在的任何字符,它就会中断 - 这就是您想要的吗?

标签: c# .net url ftp


【解决方案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));
    }
}

这将使您在encoded 中获得longname_%AE.png_thumbnail.jpg

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 2012-08-26
    • 1970-01-01
    • 2012-12-14
    • 2012-01-27
    • 2011-04-03
    • 2010-10-09
    • 1970-01-01
    • 2018-06-30
    相关资源
    最近更新 更多