核心要点
本文将介绍一种简单而灵活的任意字符集计数技术。虽然这种技术并非经常需要,但当需要时,你会发现 JavaScript 的内置函数无法完全处理它。JavaScript 确实具有用于解析和转换不同数值基数之间数字的内置函数。例如,parseInt
方法可以处理从 2 到 36 的任何基数(数值基数),通常用于非十进制基数的数字转换和计数。Number.toString
方法可以进行反向转换,将十进制数字转换回非十进制数字字符串:
var character = "2F"; alert(parseInt(character, 16)); // 弹出 47 var number = 47; alert(number.toString(16)); // 弹出 "2F"
但是,如果您想使用克林贡数字进行计数呢?或者更可能的是,使用希腊字母或西里尔字母、象形文字或某种符文?我将演示的技术可以精确地做到这一点,在任何数值基数中;为了充分说明这一点,我将向您展示一些使用十六进制(16 进制)大写希腊字母的示例。
词汇表至关重要
首先,我们需要定义一个词汇表,即我们将使用的字符的字典,定义为 Unicode 转义序列的单个字符串。在本例中,我们有 16 个大写希腊字母,从 Alpha 到 Pi——每个数字都由一个字母表示,整个字符串的长度决定了数值基数:
var lexicon = "u0391u0392u0393u0394u0395u0396u0397u0398u0399u039au039bu039cu039du039eu039fu03a0";
转义序列是一个字符
值得注意的是,即使定义 Unicode 转义序列需要六个键入字符,它在字符串中仍然只显示为一个字符,因此词汇表长度为 16 个字符。一旦我们有了词汇表,我们就可以使用 String.charAt
按数字索引引用字符,反之,可以使用 String.indexOf
获取字符的数字索引:
var character = "2F"; alert(parseInt(character, 16)); // 弹出 47 var number = 47; alert(number.toString(16)); // 弹出 "2F"
因此,我们执行的任何计算都将基于这两种方法。例如,让我们定义一个循环,运行 "Κ" 次迭代,并列出其间的每个字符:
var lexicon = "u0391u0392u0393u0394u0395u0396u0397u0398u0399u039au039bu039cu039du039eu039fu03a0";
但是,对于更大的数字,例如显示 23 的字符等价物呢?我们只需提取各个数字,然后获取字符等价物,在本例中为 2 和 3:
var number = lexicon.indexOf("u0398"); // "Θ" 的十进制等价物 var character = lexicon.charAt(7); // 7 的字符等价物
为了使事情变得更有趣,如果我们要转换的数字包含字母和数字,例如十六进制数 "2F" 呢?在这种情况下,我们必须单独转换每个数字,因为我们不能按十六进制索引引用字符(即 lexicon.charAt("F")
必须变成 lexicon.charAt(15)
):
var str = ""; for(var i=0; i<lexicon.indexOf("u039a"); i++) { str += lexicon.charAt(i); } alert(str);
当然,最后两个例子相当简单,因为数字的位数是已知的;但是,调整该过程以迭代数字包含的任意位数并不困难。这里提供了所需的所有组件,只需根据您的具体要求调整它们即可。
数据至关重要!
碰巧的是,如果需要,您可以使用完全相同的方法使用普通的拉丁数字和字母进行计数。词汇表的可扩展性意味着您可以使用它将 JavaScript 的原生能力扩展到大于 36 的基数,并使用当时看起来合适的任何符号。
或者只是开发一些时髦的时钟!
想要了解更多?
如果您想阅读更多来自 James 的内容,请订阅我们的每周科技极客新闻通讯《Tech Times》。
关于任意字符集的常见问题解答 (FAQ)
(此处应包含原文中提供的FAQ部分,由于篇幅原因,此处省略)
以上是用任意角色集来计数的详细内容。更多信息请关注PHP中文网其他相关文章!