簡體   English   中英

有沒有辦法重新定義 Javascript charCodeAt 和 fromCharCode 從函數內調用的標准 Ascii 字符集?

[英]Is there a way to redefine the standard Ascii character set that Javascript charCodeAt and fromCharCode calls from within a function?

對於編碼,Javascript 從標准 Anscii 表中提取用於映射字符。 我在下面發現了以下函數,它可以出色且正確地編碼為 Anscii85/Base85。 但我想編碼到 Z85 變體,因為它包含我需要的一組符號。 我的理解是 Anscii85/Base85 編碼應該完全相同,除了 Z85 以與 Anscii 標准不同的順序映射值,並且使用與標准 Ansii85 映射不同的符號組合。 所以字符集是唯一的區別:

Ansci85 使用 85 個字符,32 到 126(參考): "!\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstu

Z85 使用自定義的 85 個字符集(參考): 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#

我的問題是,有沒有辦法重新定義 charCodeAt 和 fromCharCode 在這個函數中引用的字符集,以便它可以在 Z85 中編碼?

// By Steve Hanov. Released to the public domain.
function encodeAscii85(input) {
// Remove Adobe standard prefix
//  var output = "<~";
  var chr1, chr2, chr3, chr4, chr, enc1, enc2, enc3, enc4, enc5;
  var i = 0;

  while (i < input.length) {
    // Access past the end of the string is intentional.
    chr1 = input.charCodeAt(i++);
    chr2 = input.charCodeAt(i++);
    chr3 = input.charCodeAt(i++);
    chr4 = input.charCodeAt(i++);

    chr = ((chr1 << 24) | (chr2 << 16) | (chr3 << 8) | chr4) >>> 0;

    enc1 = (chr / (85 * 85 * 85 * 85) | 0) % 85 + 33;
    enc2 = (chr / (85 * 85 * 85) | 0) % 85 + 33;
    enc3 = (chr / (85 * 85) | 0 ) % 85 + 33;
    enc4 = (chr / 85 | 0) % 85 + 33;
    enc5 = chr % 85 + 33;

    output += String.fromCharCode(enc1) +
      String.fromCharCode(enc2);
    if (!isNaN(chr2)) {
      output += String.fromCharCode(enc3);
      if (!isNaN(chr3)) {
        output += String.fromCharCode(enc4);
        if (!isNaN(chr4)) {
          output += String.fromCharCode(enc5);
        }
      }
    }
  }
// Remove Adobe standard suffix
//  output += "~>";

  return output;
}

額外說明:

或者,我想我可以使用類似下面的函數,但問題是它首先沒有正確編碼 Anscii85。 如果它是正確的, Hello world! 應該編碼為87cURD]j7BEbo80 ,但此函數將其編碼為RZ!iCB=*gD0D5_+參考)。

我不太了解算法,無法知道這里的映射有什么問題。 理想情況下,如果編碼正確,我應該能夠更新此函數以使用 Z85 字符集:

// Adapted from: Ascii85 JavaScript implementation, 2012.10.16 Jim Herrero
// Original: https://jsfiddle.net/nderscore/bbKS4/
var Ascii85 = {
    // Ascii85 mapping
    _alphabet: "!\"#$%&'()*+,-./0123456789:;<=>?@"+
               "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`"+
               "abcdefghijklmnopqrstu"+

               "y"+ // short form 4 spaces (optional)
               "z", // short form 4 nulls (optional)

    // functions
    encode: function(input) {
        var alphabet = Ascii85._alphabet,
            useShort = alphabet.length > 85,
            output = "", buffer, val, i, j, l;

        for (i = 0, l = input.length; i < l;) {
            buffer = [0,0,0,0];
            for (j = 0; j < 4; j++)
                if(input[i])
                  buffer[j] = input.charCodeAt(i++);

            for (val = buffer[3], j = 2; j >= 0; j--)
                val = val*256+buffer[j];

            if (useShort && !val) 
                output += alphabet[86];
            else if (useShort && val == 0x20202020) 
                output += alphabet[85];
            else {
                for (j = 0; j < 5; j++) {
                    output += alphabet[val%85];
                    val = Math.floor(val/85);
                }
            }
        }

        return output;
    }
};

字符代碼是字符代碼。 您無法更改String.fromCharCode()String.charCodeAt()的行為。

但是,您可以將自定義字符集存儲在數組中,並使用數組索引和Array.indexOf()來查找條目。

但是,更新此函數以使用 Z85 會很棘手,因為String.fromCharCode()String.charCodeAt()用於兩種不同的上下文——它們有時用於訪問未編碼的字符串(不需要更改),有時是編碼字符串(確實如此)。 您需要注意不要混淆兩者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM