Android:Uri 编码地名中的神秘转义单引号

Android: mysterious escaped single quote in Uri encoded place name

我正在使用 PlaceAutocomplete 获取地名,然后我 url 对其进行编码并作为 GET 请求的一部分发送到远程主机(在 URL).

在远程主机上,我发现一些用户设备正在发送被转义的单引号,这导致了一个问题,因为地名是作为 URL.[=22 的一部分发送的=]

例如“Andy's Place”被发送为“Andy\'s Place

和反斜杠 \ 是 URL 的一部分,原因很明显。

...但大多数情况下,不会发生...例如在我自己的测试设备上它没有...这个地方是 sent/received as "Andy's Place".

我正在尝试从头到尾遍历整个链,以查看可能发生意外转义的位置。我试图总结下面的链,沿途遗漏了一些东西(例如,我不 发送 placeName,我也将它与其他东西一起发送)......我希望我已经包括了所有重要的部分:

Place place = PlaceAutocomplete.getPlace(this, data);
String placeName = (String) place.getName();
EditText_placeName.setText(placeName);
// ... later ...
String newPlaceName = EditText_placeName.getText().toString();
String encodedPlaceName = Uri.encode(newPlaceName);
URL url = new URL(strBaseURL + '/' + encodedPlaceName);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
responseCode = connection.getResponseCode();

上述链中是否有任何内容可能会在 某些 设备(而非其他设备)的 URL 中引入不需要的转义字符?

作为一种脚注,我知道通过 POST(在正文中)而不是 GET(作为 URL 的一部分)发送数据可能是更好(可能会完全解决我的问题),这确实是我现在正在努力的方向,但我仍然想知道 \ 角色是如何通过上述链条的,至少部分是好奇

好的,我想通了,"issue" 实际上发生在 我原来的 post 中提到的处理链之后。我将详细说明实际发生的情况,以防在这种情况下对其他人有所帮助。

\' 实际上是由于字符串在 node.js 应用程序中的记录方式而出现的。每当 node.js 应用程序发生超时(这只是偶尔发生,事实证明与 \' 问题无关),我停止处理,并且 return 出现错误。

出于诊断目的,我将导致超时的 URL 添加到 Error 对象(我自己创建的对象或已经存在的对象),以便我可以访问该 URL 再次尝试重现问题并查看可能导致超时的原因。

所以像这样:

var err = new Error('oh dear');
err.recreate = theURLString; // the URL for the request that led to the problem
console.log(err);

碰巧,当我将此 err 记录到控制台(如上)时,that 是引入 \' 的时候......即 theURLString 中的任何 ' 字符显示为 \'.

所以我猜一定是 Error 对象的 .toString() 实现在执行此操作。当我执行以下操作时:

console.log(JSON.stringify(err));

... \' 序列 没有 出现。

甚至只是原始 URL 字符串:

console.log(theURLString);

所以,问题(比如它)只是在日志记录阶段,而不是之前。 每个 请求在 URL 中没有发生 ',只是因为不是每个 ' 的请求都会导致超时(通常问题只是资源过载)。之前的所有事情都让我偏离了轨道。