什么是最小的URL友好编码?

7
我正在寻找一种在空间方面最有效的 URL 编码方法。原始二进制(base2)可以用较小且安全的 base16 表示,但是 base64 更加高效。然而,通常的 base64 编码不安全。那么,什么是最小的编码方法,同时也适用于 URL 呢?
3个回答

4
这是Base64 URL编码变体的用途。
它使用相同的标准Base64字母表,只是将+改为-,将/改为_
大多数现代Base64实现都支持这种替代编码。如果你的不支持,通常只需要在解码前对Base64输入进行搜索/替换,或在发送到浏览器之前对输出进行搜索/替换。

2

"base66"(理论上,根据规范)

据我所知,URL的最佳编码方式是使用“base66”编码,并采用以下字母表:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789-_.~

以下是 URI 规范 RFC 3986(第2.3节)中的所有“非保留字符”,因此它们将按原样出现在 URL 中。使用此“base66”编码可以生成类似于以下 URL:

https://example.org/articles/.3Ja~jkWe

问题是,您是否希望在URL中使用 . ~

在一些旧服务器上(现在已经很古老了,我猜), ~ joe 将意味着此服务器上用户 joe 的“www目录”。因此,用户可能会对 ~ 字符在URL中间的作用感到困惑。这在学术网站上很常见,尤其是计算机科学教授的网站(例如Donald Knuth的网站https://www-cs-faculty.stanford.edu/~knuth/)。

“base80”(在实践中,但未经过测试)

然而,在我的测试中,以下14个其他符号也不会被百分比编码(在Chrome 95和Firefox 93中):

!$'()*+,:;=@[]

(另请参见此StackOverflow答案

这样可以留下“base80” URL编码的可能性。其中一些字符(特别是+=)在URL的查询字符串部分中无法使用,只能在路径部分中使用。总的来说,这将为您提供美丽、超压缩的URL,例如:

https://example.org/articles/1OWG,HmpkySCbBy@RG6_,
https://example.org/articles/21Cq-b6Ud)txMEW$,hc4K
https://example.org/articles/:3Tx**U9X'd;tl~rR]q+

有很多原因可能会让你不想在URL中包含所有这些符号。一个例子是StackOverflow自己的“链接生成器”不会在生成的链接中包含结尾逗号(我在这里手动将其作为链接的一部分)。

此外,百分号编码似乎非常棘手。在某些情况下,Firefox最初会对'~]进行百分比编码,但在后续请求中则不会。


1

你可以使用62个字符的表示法代替通常的64进制。这将给你类似于YouTube的URL: http://www.youtube.com/watch?v=0JD55e5h5JM

如果需要将字符串映射到数据库的数字ID,你可以使用此页面提供的PHP函数。

http://bsd-noobz.com/blog/how-to-create-url-shortening-service-using-simple-php

如果您需要将数字ID直接转换为短URL字符串,请使用以下代码: http://kevin.vanzonneveld.net/techblog/article/create_short_ids_with_php_like_youtube_or_tinyurl/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接