﻿	function pformat(value,digit) {
		var vd = 1,result='',n;
		while(value >>> (vd * 4) > 0) { vd++; }
		for(n=0;n<digit-vd;n++) {
			result += '0';
		}
		result += value.toString(16);
		return result;
	}
	function UtfToUcs() {
		var n,val,StrResult='';
		var Str = document.input.str.value;
		var escStr = encodeURIComponent(Str);

		//UTF8 エスケープ
		//先頭から順に処理
		var byteCode = new Array();
		for(n=0;n<escStr.length;n++) {
			val = escStr.substr(n,1);
			if(val == '%') {
				byteCode.push(parseInt(escStr.substr(n+1,2),16));
				n += 2;
			} else {
				byteCode.push(val.charCodeAt(0));
			}
		}


		for(n=0;n<byteCode.length;n++) {
			if(byteCode[n] < 0x80) {
				//１バイト文字
				StrResult += ' U+' + pformat(byteCode[n],4);
			} else if(byteCode[n] < 0xE0) {
				//２バイト文字
				val = ((byteCode[n] & 0x1F) << 6) + (byteCode[n+1] & 0x3F);
				StrResult += ' U+' + pformat(val,4);
				n++;
			} else if(byteCode[n] < 0xF0) {
				//３バイト文字
				val = ((byteCode[n] & 0xF) << 12) 
					+ ((byteCode[n+1] & 0x3F) << 6) 
					+ (byteCode[n+2] & 0x3F);
				StrResult += ' U+' + pformat(val,4);
				n += 2;
			} else if(byteCode[n] < 0xF8) {
				//４バイト文字
				val = ((byteCode[n] & 0x7) << 18) 
					+ ((byteCode[n+1] & 0x3F) << 12) 
					+ ((byteCode[n+2] & 0x3F) << 6) 
					+ (byteCode[n+3] & 0x3F);
				StrResult += ' U+' + pformat(val,6);
				n += 3;
			} else if(byteCode[n] < 0xF0) {
				//５バイト文字
				val = ((byteCode[n] & 0x3) << 24) 
					+ ((byteCode[n+1] & 0x3F) << 18) 
					+ ((byteCode[n+2] & 0x3F) << 12) 
					+ ((byteCode[n+3] & 0x3F) << 6) 
					+ (byteCode[n+4] & 0x3F);
				StrResult += ' U+' + pformat(val,6);
				n += 4;
			} else if(byteCode[n] < 0xFC) {
				//５バイト文字
				val = ((byteCode[n] & 0x3) << 24) 
					+ ((byteCode[n+1] & 0x3F) << 18) 
					+ ((byteCode[n+2] & 0x3F) << 12) 
					+ ((byteCode[n+3] & 0x3F) << 6) 
					+ (byteCode[n+4] & 0x3F);
				StrResult += ' U+' + pformat(val,8);
				n += 4;
			} else if(byteCode[n] < 0xFE) {
				//６バイト文字
				val = ((byteCode[n] & 0x1) << 30) 
					+ ((byteCode[n+1] & 0x3F) << 24) 
					+ ((byteCode[n+2] & 0x3F) << 18) 
					+ ((byteCode[n+3] & 0x3F) << 12) 
					+ ((byteCode[n+4] & 0x3F) << 6) 
					+ (byteCode[n+5] & 0x3F);
				StrResult += ' U+' + pformat(val,8);
				n += 5;
			}
		}

		document.getElementById('output').innerHTML = StrResult.toUpperCase();
	}
