単純にencodeURIで送受信しただけの
PHPでGET,POST がSafariで文字化けしたので、
【Ajax】日本語文字列防忘メモ の「2:単体のPCとサーバーで送受信する場合 」に書いた自家製エンコード方法を試してみます。
一応、今のところ、サーバー側の文字コード設定には依存しない感じがします。Mac Safari1.25もOKです。
ここで、手製エンコード処理のベースのエンコーダー/デコーダーとして利用しているencodeURIComponent/decodeURIComponentは、ブラウザにかかわらずutf-8として処理してくれるので、どんな文字コード下にあっても安心です。
この2つのメソッドがエスケープする文字列は下記の通りです。手製でエンコードをカスタマイズする際には、置き換え文字に「エスケープされない文字列」を使うと、実際の文字列なのか置き換えなのかわからなくなりますから、置き換え文字には「# ; / ? : @ & = + $ ,」などの「エスケープされる文字列」を使うべきです。( ちなみに、encodeURI/decodeURI は、下記の予約語「; / ? : @ & = + $ , 」をエスケープしません。)
|
encodeURIComponent/decodeURIComponentがエンコード/デコードする文字列
( ECMA-262 3rd Edition 和訳 : 15.1.3 URI 処理関数のプロパティ )
|
|
エスケープされない文字列
|
0 1 2 3 4 5 6 7 8 9
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
- _ . ! ~ * ' ( ) "%xx形式(xは16進数)"
|
|
エスケープされる文字列
|
# ; / ? : @ & = + $ , 半角空白 その他すべて
|
* この件についての考察(<ってほどではないですが)は、
【Ajax】日本語文字列防忘メモ の「2:単体のPCとサーバーで送受信する場合 」をご参照ください。つっこみ歓迎です。
あとの課題としては、たとえば、変換の塩加減をランダムに生成して、セッション毎に同一のenc/decするようにできれば、JavaScript内にも証拠が残りませんし、ましてTCPをモニタするだけでは、そう簡単には解読できなくなくなると思います。多少はデータも小さくできますしね。
GETで送/受信
POSTで送/受信
関数化してGETで送/受信
関数化してGETで送/受信 2
暫定ライブラリ jslb_ajax02.js
【 暫定ライブラリ jslb_ajax02.js 】
//XMLHttpRequestオブジェクト生成
//createHttpRequest()
//
// @returns XMLHttpRequestオブジェクト またはnull
//
function createHttpRequest()
{
if(window.ActiveXObject)
{
try
{
return new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
return new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e2)
{
return null;
}
}
}
else if(window.XMLHttpRequest)
{
return new XMLHttpRequest();
}
else
{
return null;
}
}
// requestFile( callback , data , method , fileURL , async )
//
// @param callback 受信時に起動する関数名
// @param data 送信するデータ
// @param method "POST" or "GET"
// @param fileURLリクエストするファイルのURL
// @param async Asyncならtrue Syncならfalse
// --@param user A username for authentication if necessary.
// --@param password A password for authentication if necessary.
// パスワード等はとりあえず省略
//
function requestFile( callback , data , method , fileURL , async )
{
//XMLHttpRequestオブジェクト生成
var oj = createHttpRequest()
if( oj == null ) return null
//ブラウザ判定-->別関数にした方がすっきりする?
var ua = navigator.userAgent
var safari = ua.indexOf("Safari")!=-1
var konqueror = ua.indexOf("Konqueror")!=-1
var mozes = ((a=navigator.userAgent.split("Gecko/")[1] )?a.split(" ")[0]:0) >= 20011128
//Konquerorはonloadが不安定http://jsgt.org/ajax/ref/test/response/responsetext/try1.php
if(window.opera || safari || mozes)
{
oj.onload = function () { callback(oj) }
}
else
{
oj.onreadystatechange =function ()
{
if ( oj.readyState == 4 )
{
callback(oj)
}
}
}
//open メソッド
oj.open( method , fileURL , async )
if(method == 'POST')
{
//このメソッドがWin Opera8でエラーになったので、とりあえず分岐2005.5.20
if(!window.opera)
oj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
}
//send メソッド
oj.send(data)
}