新浪微博url与mid相互转换(自己总结整理各种语言版本)

转载:
比如这条微博:http://weibo.com/user/1713926427/zF4mOFpN7A
字符串为   zF4mOFpN7A
分组,从后往前4个字符一组,得到以下三组字符:
zF
4mOF
pN7A

这三组字符实际上是62进制表示的数值
62进制的字典是0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
按照字典把这三组字符转换成10进制,得到三组数字:
2211
1041021
6147026
拼起来,得出mid:221110410216147026
Java版:
public class WeiboID {

	public static class Base62Util {
	     static String[] str62key = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
	            "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
	            "S", "T", "U", "V", "W", "X", "Y", "Z" };
	/**
	* url转化成mid的值
	* @param url
	* @return
	*/
	    public static   String url2mid(String url) {

	        String mid = "";
	        String k = url.toString().substring(3, 4);//用于第四位为0时的转换
	        if (!k.equals("0")) {
	            for (int i = url.length() - 4; i > -4; i = i - 4) {//分别以四个为一组
	                int offset1 = i < 0 ? 0 : i;
	                int offset2 = i + 4;
	                String str = url.toString().substring(offset1, offset2);
	                str = str62to10(str);//String类型的转化成十进制的数
	                // 若不是第一组,则不足7位补0
	                if (offset1 > 0) {
	                    while (str.length() < 7) {
	                        str = '0' + str;
	                    }
	                }
	                mid = str + mid;
	            }
	        } else {
	            for (int i = url.length() - 4; i > -4; i = i - 4) {
	                int offset1 = i < 0 ? 0 : i;
	                int offset2 = i + 4;
	                if (offset1 > -1 && offset1 < 1 || offset1 > 4) {
	                    String str = url.toString().substring(offset1, offset2);
	                    str = str62to10(str);
	                    // 若不是第一组,则不足7位补0
	                    if (offset1 > 0) {
	                        while (str.length() < 7) {
	                            str = '0' + str;
	                        }
	                    }
	                    mid = str + mid;
	                } else {
	                    String str = url.toString().substring(offset1 + 1, offset2);
	                    str = str62to10(str);
	                    // 若不是第一组,则不足7位补0
	                    if (offset1 > 0) {
	                        while (str.length() < 7) {
	                            str = '0' + str;
	                        }
	                    }
	                    mid = str + mid;
	                }
	            }
	        }
	        return mid;
	    }
	/**
	* mid转换成url编码以后的值
	* @param mid
	* @return
	*/
	    public static  String mid2url(String mid) {
	        String url = "";
	        for (int j = mid.length() - 7; j > -7; j = j - 7) {//以7个数字为一个单位进行转换
	            int offset3 = j < 0 ? 0 : j;
	            int offset4 = j + 7;
	            // String l = mid.substring(mid.length() - 14, mid.length() - 13);
	            if ((j > 0 && j < 6 ) && (mid.substring(mid.length() - 14, mid.length() - 13).equals("0")&& mid.length()==19)) {
	                String num = mid.toString().substring(offset3 + 1, offset4);
	                num = int10to62(Integer.valueOf(num));//十进制转换成62进制
	                url = 0 + num + url;
	                if(url.length()==9 ){
	                    url = url.substring(1, url.length());
	                }
	            } else {
	                String num = mid.toString().substring(offset3, offset4);
	                num = int10to62(Integer.valueOf(num));
	                url = num + url;
	            }
	        }
	        
	        return url;
	    }
	/**
	* 62进制转换成10进制
	* @param str
	* @return
	*/
	    public static  String str62to10(String str) {
	        String i10 = "0";
	        int c = 0;
	        for (int i = 0; i < str.length(); i++) {
	            int n = str.length() - i - 1;
	            String s = str.substring(i, i + 1);
	            for (int k = 0; k < str62key.length; k++) {
	                if (s.equals(str62key[k])) {
	                    int h = k;
	                    c += (int) (h * Math.pow(62, n));
	                    break;
	                }
	            }
	            i10 = String.valueOf(c);
	        }
	        return i10;
	    }
	/**
	* 10进制转换成62进制
	* @param int10
	* @return
	*/
	    public static  String int10to62(double int10) {
	        String s62 = "";
	        int w = (int) int10;
	        int r = 0;
	        int a = 0;
	        while (w != 0) {
	            r = (int) (w % 62);
	            s62 = str62key[r] + s62;
	            a = (int) (w / 62);
	            w = (int) Math.floor(a);
	        }
	        return s62;
	    }
	    
	    public static  void main(String[] args) throws Exception {
	        String aa = url2mid("zeRxPdQhO");
	        System.out.println(aa);
	        String bb = mid2url("3535424213299256");
	        System.out.println(bb);
	    }
	}
}

PhP版:mid转url

midToStr($mid);

//mid转换为url地址后缀
function midToStr($mid)
{
    settype($mid,'string');
    $mid_length=strlen($mid);
    $url='';
    $str=strrev($mid);
    $str=str_split($str,7);
    
    foreach($str as $v)
    {
        $url.=intTo62(strrev($v));
    }
    
    $url_str=strrev($url);
    
    return $url_str;
}

function str62keys($key)//62进制字典 
{ 
    $str62keys = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9","a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z","A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"); 
    return $str62keys[$key];
}

/* url 10 进制 转62进制*/
function intTo62($int10)
{
     $s62 = '';
     $r = 0;
    while ($int10 != 0)
    {
        $r = $int10 % 62;
        $s62.= str62keys($r);
        $int10 = floor($int10 / 62);
    }
    return $s62;
}
JS版:

var WeiboUtility = {};

/**
 * 62进制字典
 */
WeiboUtility.str62keys = [
	"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
	"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
	"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
];

/**
 * 62进制值转换为10进制
 * @param {String} str62 62进制值
 * @return {String} 10进制值
 */
WeiboUtility.str62to10 = function(str62) {
	var i10 = 0;
	for (var i = 0; i < str62.length; i++)
	{
		var n = str62.length - i - 1;
		var s = str62[i];
		i10 += this.str62keys.indexOf(s) * Math.pow(62, n);
	}
	return i10;
};

/**
 * 10进制值转换为62进制
 * @param {String} int10 10进制值
 * @return {String} 62进制值
 */
WeiboUtility.int10to62 = function(int10) {
	var s62 = '';
	var r = 0;
	while (int10 != 0)
	{
		r = int10 % 62;
		s62 = this.str62keys[r] + s62;
		int10 = Math.floor(int10 / 62);
	}
	return s62;
};

/**
 * URL字符转换为mid
 * @param {String} url 微博URL字符,如 "wr4mOFqpbO"
 * @return {String} 微博mid,如 "201110410216293360"
 */
WeiboUtility.url2mid = function(url) {
	var mid = '';
	
	for (var i = url.length - 4; i > -4; i = i - 4)	//从最后往前以4字节为一组读取URL字符
	{
		var offset1 = i < 0 ? 0 : i;
		var offset2 = i + 4;
		var str = url.substring(offset1, offset2);
		
		str = this.str62to10(str);
		if (offset1 > 0)	//若不是第一组,则不足7位补0
		{
			while (str.length < 7)
			{
				str = '0' + str;
			}
		}
		
		mid = str + mid;
	}
	
	return mid;
};

/**
 * mid转换为URL字符
 * @param {String} mid 微博mid,如 "201110410216293360"
 * @return {String} 微博URL字符,如 "wr4mOFqpbO"
 */
WeiboUtility.mid2url = function(mid) {
	if (typeof(mid) != 'string') return false;	//mid数值较大,必须为字符串!
	
	var url = '';
	
	for (var i = mid.length - 7; i > -7; i = i - 7)	//从最后往前以7字节为一组读取mid
	{
		var offset1 = i < 0 ? 0 : i;
		var offset2 = i + 7;
		var num = mid.substring(offset1, offset2);
		
		num = this.int10to62(num);
		url = num + url;
	}
	
	return url;
};

注:以上版本中Java版,亲测没有问题,其他的不清楚。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值