假设我有一个能够handling deep links和“my-app:”名字对象的Windows Phone应用程序。给出以下示例链接:
我的应用内://做/东西/艺术家=了Macklemore%20%26%20Ryan%20Lewis&安培;测试= 1
我们可以看到两个查询字符串参数artist = "Macklemore & Ryan Lewis"
和test = "1"
。
如果我在其上创建一个包含该链接的网页并在手机中的Internet Explorer中打开该页面,那么这就是应用程序UriMapper的内容:
/协议?encodedLaunchUri =我的应用内%3A%2F%2Fdo%2Fstuff%2F%3Fartist%3DMacklemore%20%26%20Ryan%20Lewis%26test%3D1
因此,似乎没有%
个编码值重新编码,但它在&
参数之前编码test
...
在我看来,这似乎是一个平台错误,因为我们无法区分&我们得到UriMapper的字符!
所以问题是,是否有人知道在Windows手机深层链接中使用编码&符号(%26)的方法?
答案 0 :(得分:2)
我怀疑使用任何公共API访问该问题的级别可能太低。
作为一个起点,我想到了我们可以使用的东西(并且不需要在用户方面进行更改),这是检测&
符号所在位置的能力。从中我们可以确定&
是否是值的一部分或查询字符串分隔符。如果是后者,我们将其替换为随机字符并拆分该字符。
Regex rx = new Regex(@"(\b&.*?)=");
上述正则表达式仅匹配&
之后的=
(因此它与下面的&test=
匹配,但不匹配Macklemore & Ryan Lewis
)。
然后,我们将所有与上述正则表达式匹配的&
实例替换为其他地方不会使用的随机字符。对于此示例,我只使用了|
。
string mapperInput = @"Protocol?encodedLaunchUri=my-app://do/stuff/?artist=Macklemore & Ryan Lewis&test=1";
string final = rx.Replace(mapperInput,
new MatchEvaluator(
new Func<Match, string>(x => x.Value.Replace('&', '|'))
));
然后我们将结果放入一个集合中。
//skip 2 because the first two matches include the protocol section
var values = final.Split(new char[] { '?', '|' }).Skip(2).ToArray();
values
数组现在包含两个元素(可以迭代并放入字典中以Key-Value
访问)
artist=Macklemore & Ryan Lewis
test=1
这必须使用包含字符的各种输入进行测试,但是通过快速测试,它似乎工作正常。