核心要點
本文將介紹一種簡單而靈活的任意字符集計數技術。雖然這種技術並非經常需要,但當需要時,你會發現 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中文網其他相關文章!