« 英語ニュース自動ダウンロード 仕様変更 | メイン | 今どきのアンドロイド開発環境 »

javascript

EUCなフォームをjavascriptでPOST

UTFに移行されることなく10年以上経過するレガシーシステム。既に画面遷移の設計が破綻ぎみ。
やむを得ず、EUCで生成されているフォームをクライアントからバックグラウンドで送信することに。
ajax で POST するフォームの全てのデータをエンコードする
$('formname').serialize();
は、UTF8 前提の javascript なので EUC-JP や ShiftJIS なフォームであっても UTF8 として送信してしまう。

●前提環境
PHP Version 5.6.15
default_charset = EUC-JP
mbstring.language = Japanese
mbstring.encoding_translation = Off
mbstring.detect_order = auto
jQuery JavaScript Library v1.6.2

今回は、
http://polygon-planet-log.blogspot.jp/2012/04/javascript.html
encoding.js を利用させていただく場合の具体的な実装例...▼
index.php はEUCで
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>TITLE</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="./encoding.js"></script>
<script type="text/javascript">
<!--
function serializeFormEUCJP( idForm ){
	var str2array = function(str){
		var array = [],i,il=str.length;
		for(i=0;i<il;i++) array.push(str.charCodeAt(i));
		return array;
	};
	var forms = document.getElementById( idForm );
	var array = [];
	for(var i = 0; i < forms.length; i++){
		var elem = forms.elements[i];
		var strArray = str2array( elem.value );
		strArray = Encoding.convert(strArray,"EUCJP");
		array.push(encodeURIComponent(elem.name) + '=' + Encoding.urlEncode(strArray) );
	}
	return array.join('&');
}
function test(){
///	var q = $('#form2ajax').serialize();
	var q = serializeFormEUCJP( "form2ajax" );
	$.ajax({
		url: "./index.php",
		data: q,
		success: function(r){alert(r);},
		cache: false,
		dataType: "html",
		type: "POST"
	});
}
// -->
</script>
</head>
<body>
<div>ポストされた値:<?php echo $_POST['p1']; ?></div>
<form id="form2ajax">
<input type="text" name="p1" value="">
<input type="button" onclick="javascript:test();" value="button">
</form>
</body>
</html>

トラックバック

このエントリーのトラックバックURL:
http://www.remix.asia/cgi/mt/mt-tb.cgi/7499

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)