diff --git a/src/Maui/Prism.Maui/Navigation/Regions/Navigation/RegionNavigationContentLoader.cs b/src/Maui/Prism.Maui/Navigation/Regions/Navigation/RegionNavigationContentLoader.cs index 3a100b18e..a28579c29 100644 --- a/src/Maui/Prism.Maui/Navigation/Regions/Navigation/RegionNavigationContentLoader.cs +++ b/src/Maui/Prism.Maui/Navigation/Regions/Navigation/RegionNavigationContentLoader.cs @@ -91,7 +91,7 @@ protected virtual string GetContractFromNavigationContext(NavigationContext navi var candidateTargetContract = UriParsingHelper.EnsureAbsolute(navigationContext.Uri).AbsolutePath; candidateTargetContract = candidateTargetContract.TrimStart('/'); - return candidateTargetContract; + return Uri.UnescapeDataString(candidateTargetContract); } /// diff --git a/src/Wpf/Prism.Wpf/Navigation/Regions/RegionNavigationContentLoader.cs b/src/Wpf/Prism.Wpf/Navigation/Regions/RegionNavigationContentLoader.cs index 3d82030c8..0a629e3b9 100644 --- a/src/Wpf/Prism.Wpf/Navigation/Regions/RegionNavigationContentLoader.cs +++ b/src/Wpf/Prism.Wpf/Navigation/Regions/RegionNavigationContentLoader.cs @@ -125,7 +125,7 @@ protected virtual string GetContractFromNavigationContext(NavigationContext navi var candidateTargetContract = UriParsingHelper.GetAbsolutePath(navigationContext.Uri); candidateTargetContract = candidateTargetContract.TrimStart('/'); - return candidateTargetContract; + return Uri.UnescapeDataString(candidateTargetContract); } /// diff --git a/tests/Maui/Prism.Maui.Tests/Fixtures/Common/UriParsingHelperFixture.cs b/tests/Maui/Prism.Maui.Tests/Fixtures/Common/UriParsingHelperFixture.cs index 2327ac37f..9e3b00f3a 100644 --- a/tests/Maui/Prism.Maui.Tests/Fixtures/Common/UriParsingHelperFixture.cs +++ b/tests/Maui/Prism.Maui.Tests/Fixtures/Common/UriParsingHelperFixture.cs @@ -232,4 +232,27 @@ public void ParseForDeepLinkRelativeUri() Assert.Equal(_deepLinkRelativeUri, uri.OriginalString); Assert.False(uri.IsAbsoluteUri); } + + [Theory] + [InlineData("TestäöüView")] + [InlineData("MøbëlList")] + [InlineData("Ñoño")] + public void GetAbsolutePathUnescapesDiacritics(string viewName) + { + var uri = UriParsingHelper.Parse(viewName); + var absolutePath = UriParsingHelper.GetAbsolutePath(uri); + var result = Uri.UnescapeDataString(absolutePath.TrimStart('/')); + Assert.Equal(viewName, result); + } + + [Theory] + [InlineData("TestäöüView")] + [InlineData("MøbëlList")] + public void GetUriSegmentsUnescapesDiacritics(string viewName) + { + var uri = new Uri(viewName, UriKind.Relative); + var segments = UriParsingHelper.GetUriSegments(uri); + var segmentName = UriParsingHelper.GetSegmentName(segments.Dequeue()); + Assert.Equal(viewName, segmentName); + } }