[英]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.