自分のドメインからすべての Web サイトに配置できるスクリプト (javascript ファイル。JS) を作成したいと考えています。スクリプトは Web サイトからテキストを読み取り、それをサーバーに送信する必要があります。サーバーは、テキストを読み取る Web サイトとは別のドメインにあるため、JSONP を使用しています。読み取ったテキストはさまざまな方法 (さまざまな言語 – 世界中の Web サイト) で文字化される可能性があり、非常に長くなる可能性があるため、送信する前に base64 でコーディングし、データ パケットに分割し、GET を使用して個別に送信します ( JSONP)。
関数の定義がないgetJson()
場合、コードは次のようになります。
var sBase64Code = base64_encode( document.getElementById('idText').innerHTML );
// we devide sBase64Code into data packets,
// and changing it to array aBase64Code – I skip this algorythm
// and then I send packets to the server in loops
for(i in aBase64Code) {
getJson(['idx='+i, 'code='+aBase64Code[i]], hFunCallback);
}
ただし、コードをサーバーに送信した後、パケットを結合してデータをデコードするbase64_decode()
と、英語とは異なる文字が失われていることがわかります。
mb_convert_encoding(base64_decode($b64), mb_detect_encoding(base64_decode($b64)))
動作しません。
JavaScriptbase64_encode()
関数は次のとおりです。
function base64_encode(data) {
var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc = "", tmp_arr = [];
if(!data) return data;
do {
o1 = data.charCodeAt(i++);
o2 = data.charCodeAt(i++);
o3 = data.charCodeAt(i++);
bits = o1 << 16 | o2 << 8 | o3;
h1 = bits >> 18 & 0x3f;
h2 = bits >> 12 & 0x3f;
h3 = bits >> 6 & 0x3f;
h4 = bits & 0x3f;
tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
} while (i < data.length);
enc = tmp_arr.join('');
var r = data.length % 3;
return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
};
データ送信例:
例の Base64:WndpbmkZdGEgbmkHIHRvIGtCGWJlay4=