我如何 url 在 Dart 中以 Twitter API 期望的格式进行编码?

How do I url-encode in Dart in the format that the Twitter API expects?

我在 C# 中 wrote some code 到 post 推文。让我感到困惑的一件事是数据的 url 编码,因为似乎有很多选择:

var input = "Hello Ladies + Gentlemen, a signed OAuth request!";
var expected = "Hello%20Ladies%20%2B%20Gentlemen%2C%20a%20signed%20OAuth%20request%21";

Console.WriteLine(WebUtility.UrlEncode(input) == expected); // False
Console.WriteLine(Uri.EscapeUriString(input) == expected); // False
Console.WriteLine(Uri.EscapeDataString(input) == expected); // True

我现在正尝试在 Dart 中做同样的事情。我已经尝试了 Uri class 中的所有编码方法,但 none 似乎输出相同。

代码:(DartPad)

print(Uri.encodeQueryComponent("Hello Ladies + Gentlemen, a signed OAuth request!"));
print(Uri.encodeFull("Hello Ladies + Gentlemen, a signed OAuth request!"));
print(Uri.encodeComponent("Hello Ladies + Gentlemen, a signed OAuth request!"));

输出:

Hello+Ladies+%2B+Gentlemen%2C+a+signed+OAuth+request%21
Hello%20Ladies%20+%20Gentlemen,%20a%20signed%20OAuth%20request!
Hello%20Ladies%20%2B%20Gentlemen%2C%20a%20signed%20OAuth%20request!

最后一个(encodeComponent)好像最接近,只是感叹号打错了

是否有一种现有方法可以按照我的要求进行这种编码(与 C# 的 EscapeDataString 相同)?

我找不到与 C# 的 EscapeDataString 等效的 Dart 函数,但我认为我能够实现一个。随意尝试一下,看看是否发现任何问题。

查看此 Dartpad: https://dartpad.dartlang.org/4336dad4dc0603952a7c2e545cb8726c

它基于 Dart 文档所说的事实:

All characters except uppercase and lowercase letters, digits and the characters -_.!~*'() are percent-encoded.

所以我提供的函数添加了那些特定字符的百分比编码。

据我从 EscapeDataString 上的 C# 文档中了解到,它确实默认对这些字符进行编码,而我找不到的 Dart 函数会这样做。

convert package works perfectly. There was previously a bug causing numbers to be encoded but a fix was merged 并于今天发布 2.0.1.