通常的URL shortening技术使用通常的URL-charset中的少数几个字符,因为不需要更多。典型的短网址是http://domain/code
,其中代码是整数。假设我可以使用任何 base (base10,base16,base36,base62等)来表示数字。
QR Code have many encoding modes,我们可以优化QR码(minimal version to obtain lowest density),这样我们就可以测试一对baseX-modeY ......
什么是最好的基本模式对?
两种模式适合“URL缩短配置文件”,
我的选择是“大写base36”和字母数字(也编码“/”,“:”等),但没有看到任何证明它总是(对于任何URL长度)最好的。关于这种优化有一些很好的指南或数学演示吗?
还有另一种变体,“编码模式可以根据需要在QR符号中混合使用”(维基百科)...所以,我们也可以使用
HTTP://DOMAIN/
使用字母数字+ change_mode +数字编码(每 3 位10位)对于长URL(长整数),当然,这是最好的解决方案(!),因为使用所有字符集,没有松散......是吗?
问题是在通常的QRCode图像生成器中无法访问这种优化(混合模式)......这是可行的吗?有一台发电机正确使用吗?
(实用)问题是关于 base 和模式的最佳组合,因此我们可以将其表达为(例如Javascript)函数,
function bestBaseMode(domain,number_range) {
var dom_len = domain.length;
var urlBase_len = dom_len+8; // 8 = "http://".length + "/".length;
var num_min = number_range[0];
var num_max = number_range[1];
// ... check optimal base and mode
return [base,mode];
}
示例-1:域是“bit.ly”,代码是ISO3166-1-numeric country-code,
范围从4到894.所以urlBase_len=14
,num_min=4
和num_max=894
。
示例-2:域是“postcode-resolver.org”, number_range 参数是最频繁postal codes integer representations的范围,例如统计上推断范围从~999到~9999999。所以urlBase_len=27
,num_min=999
和num_max=9999999
。
示例-3:域是“my-example3.net”, number_range 是一个双SHA-1代码,所以固定长度的代码有40个字节(2个连接的十六进制40位长数字)。所以num_max=num_min=Math.pow(8,40)
。
答案 0 :(得分:0)
没有人想要我的赏金......我失去了它,现在也需要自己做工作;-)
goQR.me支持回复关于混合编码的特定问题,记住,遗憾的是,它无法使用,
抱歉,我们的api不支持混合qr代码编码。 甚至标准也可以定义它。真实世界的QR码扫描仪应用程序 在手机上有大量的bug,我们不建议依赖 关于这个功能。
此功能在控制台中显示答案......这是一种简化和“强力”解决方案。
/**
* Find the best base-mode pair for a short URL template as QR-Code.
* @param Msg for debug or report.
* @param domain the string of the internet domain
* @param digits10 the max. number of digits in a decimal representation
* @return array of objects with equivalent valid answers.
*/
function bestBaseMode(msg, domain,digits10) {
var commomBases= [2,8,10,16,36,60,62,64,124,248]; // your config
var dom_len = domain.length;
var urlBase_len = dom_len+8; // 8 = "http://".length + "/".length
var numb = parseFloat( "9".repeat(digits10) );
var scores = [];
var best = 99999;
for(i in commomBases) {
var b = commomBases[i];
// formula at http://math.stackexchange.com/a/335063
var digits = Math.floor(Math.log(numb) / Math.log(b)) + 1;
var mode = 'alpha';
var len = dom_len + digits;
var lost = 0;
if (b>36) {
mode = 'byte';
lost = parseInt( urlBase_len*0.25); // only 6 of 8 bits used at URL
}
var score = len+lost; // penalty
scores.push({BASE:b,MODE:mode,digits:digits,score:score});
if (score<best) best = score;
}
var r = [];
for(i in scores) {
if (scores[i].score==best) r.push(scores[i]);
}
return r;
}
运行问题示例:
var x = bestBaseMode("Example-1", "bit.ly",3);
console.log(JSON.stringify(x)) // "BASE":36,"MODE":"alpha","digits":2,"score":8
var x = bestBaseMode("Example-2", "postcode-resolver.org",7);
console.log(JSON.stringify(x)) // "BASE":36,"MODE":"alpha","digits":5,"score":26
var x = bestBaseMode("Example-3", "my-example3.net",97);
console.log(JSON.stringify(x)) // "BASE":248,"MODE":"byte","digits":41,"score":61