使用 wpf webbrowser 控件导航到带有变音符号的 uri

Navigate to uri with umlaut using wpf webbrowser control

我正在使用 WPF WebBrowser 控件导航到包含这样一个 PDF 文件的 URI:

XAML

<WebBrowser x:Name="Browser" Loaded="Browser_OnLoaded"/>

代码隐藏

        url = @"file:///c:\A.pdf"; // This works
        url = @"file:///c:\Ä.pdf"; // This shows error

        Browser.Navigate(url);

Ä.pdf 出错

问题

如何使用变音符号导航到文件?

我尝试了 UrlEncoding,更改为 ASCII 编码,使用扩展的 ASCII 都没有成功。可能吗?


编辑

使用 WebUtility.UrlEncode("Ä"); 产生 %C3%84 为什么?:

您是否尝试过:@"file:///c:\Certific%E4te.pdf" 而不是 @"file:///c:\Certificäte.pdf"(作为示例)?

更多变音符号:

  • Ä = %C4
  • Ö = %D6
  • Ü = %DC
  • ä = %E4
  • ö = %F6
  • ü = %FC
  • ß = %DF
  • € = %u20AC
  • $ = %24
  • % = %25

要使其与 WebBrowser 一起使用,您必须更新编码。通过引用 System.Web 程序集,您可以使用:

  System.Web.HttpUtility.UrlEncode("Ä", Encoding.GetEncoding("ISO-8859-1")));

对于下面的示例,我使用了字符 Ä

所有非 ASCII 字符都必须使用百分号编码字符在 URL 中编码。它在以下 RFC(第 21 页,第 3.2.2 节的最后一段)中进行了解释:https://www.rfc-editor.org/rfc/rfc3986.

非ASCII字符必须首先根据UTF-8 [STD63]进行编码,然后相应的UTF-8序列的每个八位字节必须进行百分比编码才能表示为URI字符。

所以Ä对应的UTF8字符就是C3 84。对应于百分比编码值:%C3%84.

您可以使用以下代码对您的文件名进行编码:

System.Net.WebUtility.UrlEncode("Ä");

Uri.EscapeUriString("Ä");

我认为这里的解决方案不是尝试花哨的编码,而是使用 Uri class.

这在 WPF WebBrowser 控件中对我有用:

var uri = new Uri("c:\users\täto\AppData\Roaming\MarkdownMonster\_preview.html");
PreviewBrowser.Navigate(uri);

Uri class 似乎可以毫不费力地处理所有编码。