[英]Corruption of base64-encoded ajax sends -some thoughts on this
回顧了無論使用哪種編碼方式,通過ajax調用發送到Web服務器時為什么某些字符數據都會損壞的問題。 即使將數據預編碼為7位格式,輸出的結果也不總是等於輸入的結果。
我正在使用第三方javascript base64編碼器來准備ajax數據,並且最初以為這是一個錯誤。 但是,其他base64編碼器也存在完全相同的問題-包括一個聲稱具有完全unicode兼容性的問題-並且有多個論壇報告了類似問題,但似乎都沒有完全解決。 因此,我不認為編碼器本身有問題。
我注意到,損壞通常是由於從其他程序剪切並粘貼到CKEditor中的數據引起的,如果該數據包含某些特定的高階ASCII / ANSI代碼。
還有更多測試表明,該問題與javascript從網頁讀取字符數據的方式與從內部編程方法(例如String.fromCharCode())形成字符串數據的方式之間存在某種差異有關。
在下面的代碼段中,將通過文本編輯器的剪切和粘貼操作將插入到HTML文檔中的字符0x9E與以十六進制代碼0x9E編程生成的相同字符進行比較(U + 017E-Arial Latin small small with caron,Windows西方字符集)。 這是已經發現會引起這種異常行為的幾種字符代碼之一。 奇怪的是,大多數其他> 127個字符代碼都沒有出現此類問題,並應按應有的方式呈現為兩字節unicode。
<script>
var pasted_char = 'ž';
alert("Pasted Character: " + pasted_char + " Resultant Code(s): " + charcodes(pasted_char));
var charcode = 0x9E;
var generated_char = String.fromCharCode(charcode);
alert("Generated Character: " + generated_char + " Resultant Code(s): " + charcodes(generated_char));
function charcodes(invar) {
// lists char codes for each byte in a character.
var ccodes = "~";
for (ct=0; ct<invar.length; ct++){
var invarc = invar.charCodeAt(ct);
ccodes += invarc + "~";
}
return ccodes;
}
</script>
使用UTF-8頁面字符集,可以:
粘貼的字符:[0xFFFD]結果代碼:〜65533〜
生成的字符:[空白]結果代碼:〜158〜
使用默認的頁面字符集,可以:
粘貼字符:ž結果代碼:〜382〜
生成的字符:[空白]結果代碼:〜158〜
值得注意的是,粘貼字符的處理均不正確,並且沒有382這樣的ANSI代碼!
兩個輸出均為單字節。
嚴格來說,此字符是8位ASCII / ANSI,而js並未聲明要處理該字符,但是將其粘貼到HTML編輯器(例如從文本文檔中)是完全合法的。 因此,javascript子系統應該能夠處理這種輸入而不會產生錯誤。 無論如何,在我看來,以兩種不同的方式生成相同的字符串不應返回兩個不同的結果。
任何對此的想法都將受到歡迎。 我不確定此異常在破壞ajax發送中起什么作用,但似乎是罪魁禍首。
JavaScript中的所有字符串都使用UTF-16 (有時是USC-2的前身),而不考慮頁面的字符編碼。 ES5規范的8.4節和ES3的8.5 節對此進行了說明。 對於常見字符(例如az等),這對希望使用ANSI或UTF-8代碼的影響不大,因為它們是相同的,但對於所有字符而言並非如此。
如果要生成ANSI ,則將需要一個256個項的字典或其他用於字符映射的邏輯。
這是一張這樣的表(不帶控制字符)
var ANSI = {
" ": 32,
"!": 33,
"\"": 34,
"#": 35,
"$": 36,
"%": 37,
"&": 38,
"'": 39,
"(": 40,
")": 41,
"*": 42,
"+": 43,
",": 44,
"-": 45,
".": 46,
"/": 47,
"0": 48,
"1": 49,
"2": 50,
"3": 51,
"4": 52,
"5": 53,
"6": 54,
"7": 55,
"8": 56,
"9": 57,
":": 58,
";": 59,
"<": 60,
"=": 61,
">": 62,
"?": 63,
"@": 64,
"A": 65,
"B": 66,
"C": 67,
"D": 68,
"E": 69,
"F": 70,
"G": 71,
"H": 72,
"I": 73,
"J": 74,
"K": 75,
"L": 76,
"M": 77,
"N": 78,
"O": 79,
"P": 80,
"Q": 81,
"R": 82,
"S": 83,
"T": 84,
"U": 85,
"V": 86,
"W": 87,
"X": 88,
"Y": 89,
"Z": 90,
"[": 91,
"\\": 92,
"]": 93,
"^": 94,
"_": 95,
"`": 96,
"a": 97,
"b": 98,
"c": 99,
"d": 100,
"e": 101,
"f": 102,
"g": 103,
"h": 104,
"i": 105,
"j": 106,
"k": 107,
"l": 108,
"m": 109,
"n": 110,
"o": 111,
"p": 112,
"q": 113,
"r": 114,
"s": 115,
"t": 116,
"u": 117,
"v": 118,
"w": 119,
"x": 120,
"y": 121,
"z": 122,
"{": 123,
"|": 124,
"}": 125,
"~": 126,
" ": 127,
"€": 128,
" ": 129,
"‚": 130,
"ƒ": 131,
"„": 132,
"…": 133,
"†": 134,
"‡": 135,
"ˆ": 136,
"‰": 137,
"Š": 138,
"‹": 139,
"Œ": 140,
" ": 141,
"Ž": 142,
"«": 143,
" ": 144,
"‘": 145,
"’": 146,
"“": 147,
"”": 148,
"•": 149,
"–": 150,
"—": 151,
"˜": 152,
"™": 153,
"š": 154,
"›": 155,
"œ": 156,
" ": 157,
"ž": 158,
"Ÿ": 159,
" ": 160,
"¡": 161,
"¢": 162,
"£": 163,
"¤": 164,
"¥": 165,
"¦": 166,
"§": 167,
"¨": 168,
"©": 169,
"ª": 170,
"«": 171,
"¬": 172,
"": 173,
"®": 174,
"¯": 175,
"°": 176,
"±": 177,
"²": 178,
"³": 179,
"´": 180,
"µ": 181,
"¶": 182,
"·": 183,
"¸": 184,
"¹": 185,
"º": 186,
"»": 187,
"¼": 188,
"½": 189,
"¾": 190,
"¿": 191,
"À": 192,
"Á": 193,
"Â": 194,
"Ã": 195,
"Ä": 196,
"Å": 197,
"Æ": 198,
"Ç": 199,
"È": 200,
"É": 201,
"Ê": 202,
"Ë": 203,
"Ì": 204,
"Í": 205,
"Î": 206,
"Ï": 207,
"Ð": 208,
"Ñ": 209,
"Ò": 210,
"Ó": 211,
"Ô": 212,
"Õ": 213,
"Ö": 214,
"×": 215,
"Ø": 216,
"Ù": 217,
"Ú": 218,
"Û": 219,
"Ü": 220,
"Ý": 221,
"Þ": 222,
"ß": 223,
"à": 224,
"á": 225,
"â": 226,
"ã": 227,
"ä": 228,
"å": 229,
"æ": 230,
"ç": 231,
"è": 232,
"é": 233,
"ê": 234,
"ë": 235,
"ì": 236,
"í": 237,
"î": 238,
"ï": 239,
"ð": 240,
"ñ": 241,
"ò": 242,
"ó": 243,
"ô": 244,
"õ": 245,
"ö": 246,
"÷": 247,
"ø": 248,
"ù": 249,
"ú": 250,
"û": 251,
"ü": 252,
"ý": 253,
"þ": 254,
"ÿ": 255
};
我是通過將以下代碼應用於此頁面生成的 ,並通過一些很小的修改(在\\
和"
上轉義"
)將其復制並粘貼到此處,因此您會注意到某些字符無法正確交叉(特別是不同類型的空格),並且在使用前可能需要刪除/刪除/修改它,您可能還想切換到安全的\\uXXXX
格式的字符編碼。
var cells = document.getElementsByTagName('table')[0].getElementsByTagName('td'),
a = [], i, j, k, v;
for (j = 0; j < 7; ++j) for (i = 7 + j; i < cells.length; i += 7) {
k = cells[i].textContent.slice(-1);
v = +cells[i].textContent.slice(0, 3).replace(/[^\d]/g, '');
a.push(' "' + k + '": ' + v);
}
'{\n' + a.join(',\n') + '\n}';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.