首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类似于base36的编码,包括大写字母

类似于base36的编码,包括大写字母
EN

Stack Overflow用户
提问于 2009-09-26 13:08:54
回答 2查看 3.7K关注 0票数 8

我正在使用base36来缩短URL。我有一个博客条目的id,并将该id转换为base36以使其更小。Base36仅包含小写字母。如何包含大写字母?如果我使用base64_encode,它实际上会使字符串变长。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-26 13:15:30

您可以在这两篇文章中找到创建包含字母(小写和大写)和数字的短urls的源代码示例,例如:

  • Create short IDs with PHP - Like Youtube or TinyURL
  • Building a URL Shortener

下面是第二篇文章(引用)中使用的代码部分:

代码语言:javascript
复制
$codeset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$base = strlen($codeset);
$n = 300;
$converted = "";

while ($n > 0) {
  $converted = substr($codeset, ($n % $base), 1) . $converted;
  $n = floor($n/$base);
}

echo $converted; // 4Q

您可以很容易地将其封装在一个函数中--唯一要考虑的是将$n作为参数接收:

代码语言:javascript
复制
function shorten($n) {
    $codeset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $base = strlen($codeset);
    $converted = "";
    while ($n > 0) {
      $converted = substr($codeset, ($n % $base), 1) . $converted;
      $n = floor($n/$base);
    }
    return $converted;
}

并这样称呼它:

代码语言:javascript
复制
$id = 123456;
$url = shorten($id);
var_dump($url);

你会得到:

代码语言:javascript
复制
string 'w7e' (length=3)

(如果需要,您还可以添加一些其他字符--这取决于您希望在URL中获得的内容)

注释后的编辑:

通读第二篇文章(我从中获得了缩写代码),您会发现执行非缩写的代码。

将这些代码封装到一个函数中应该不是很难,可能会得到如下结果:

代码语言:javascript
复制
function unshorten($converted) {
    $codeset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $base = strlen($codeset);
    $c = 0;
    for ($i = strlen($converted); $i; $i--) {
      $c += strpos($codeset, substr($converted, (-1 * ( $i - strlen($converted) )),1)) 
            * pow($base,$i-1);
    }
    return $c;
}

并使用缩短的url调用它:

代码语言:javascript
复制
$back_to_id = unshorten('w7e');
var_dump($back_to_id);

将会给你带来:

代码语言:javascript
复制
int 123456
票数 11
EN

Stack Overflow用户

发布于 2009-09-26 13:15:30

代码语言:javascript
复制
function dec2any( $num, $base=62, $index=false ) {

    // Parameters:
    //   $num - your decimal integer
    //   $base - base to which you wish to convert $num (leave it 0 if you are providing $index or omit if you're using default (62))
    //   $index - if you wish to use the default list of digits (0-1a-zA-Z), omit this option, otherwise provide a string (ex.: "zyxwvu")

    if (! $base ) {
        $base = strlen( $index );
    } else if (! $index ) {
        $index = substr( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,0 ,$base );
    }
    $out = "";
    for ( $t = floor( log10( $num ) / log10( $base ) ); $t >= 0; $t-- ) {
        $a = floor( $num / pow( $base, $t ) );
        $out = $out . substr( $index, $a, 1 );
        $num = $num - ( $a * pow( $base, $t ) );
    }
    return $out;
}

厚颜无耻地从PHP的base_convert()页面上的评论者那里借用(base_convert()只能工作到32进制)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1481173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档