4

假设我有一个能够处理带有“my-app:”绰号的深层链接的 Windows Phone 应用程序。给定以下示例链接:

my-app://do/stuff/?artist=Macklemore%20%26%20Ryan%20Lewis&test=1

我们可以看到两个查询字符串参数,artist = "Macklemore & Ryan Lewis"test = "1"

如果我创建一个带有该链接的网页并在手机中打开 Internet Explorer 中的页面,这就是应用程序 UriMapper 的内容:

/Protocol?encodedLaunchUri=my-app%3A%2F%2Fdo%2Fstuff%2F%3Fartist%3DMacklemore%20%26%20Ryan%20Lewis%26test%3D1

因此,似乎没有一个%编码值被重新编码,但它却对参数&之前的值进行了编码test……</p>

在我看来,这像是一个平台错误,因为我们无法区分 UriMapper 上的 & 字符!

所以问题是,是否有人知道在 Windows Phone 深层链接中使用编码 & 符号 (%26) 的方法?

4

1 回答 1

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数组现在包含两个元素(可以迭代并放入 Dictionary 以进行Key-Value访问)

artist=Macklemore & Ryan Lewis
test=1

这必须使用包括字符的各种输入进行测试,但从快速测试来看,它似乎工作正常。

于 2013-08-01T14:36:41.277 回答