【JavaScript】文字列 ⇔ UTF8の16進数文字列変換

作ってみた(・ω・)ノシ

prototype001.js --- UTF8⇔16進数文字列変換Javascript

// 文字列をUTF8の16進文字列に変換
function	string_to_utf8_hex_string	(text)
{
	var bytes1 = string_to_utf8_bytes(text);
	var hex_str1 = bytes_to_hex_string(bytes1);
	return hex_str1;
}


// UTF8の16進文字列を文字列に変換
function	utf8_hex_string_to_string	(hex_str1)
{
	var bytes2 = hex_string_to_bytes(hex_str1);
	var str2 = utf8_bytes_to_string(bytes2);
	return str2;
}



// 文字列をUTF8のバイト配列に変換
function	string_to_utf8_bytes	(text)
{
    var result = [];
    if (text == null)
        return result;
    for (var i = 0; i < text.length; i++) {
        var c = text.charCodeAt(i);
        if (c <= 0x7f) {
            result.push(c);
        } else if (c <= 0x07ff) {
            result.push(((c >> 6) & 0x1F) | 0xC0);
            result.push((c & 0x3F) | 0x80);
        } else {
            result.push(((c >> 12) & 0x0F) | 0xE0);
            result.push(((c >> 6) & 0x3F) | 0x80);
            result.push((c & 0x3F) | 0x80);
        }
    }
    return result;
}

// バイト値を16進文字列に変換
function	byte_to_hex	(byte_num)
{
	var digits = (byte_num).toString(16);
    if (byte_num < 16) return '0' + digits;
    return digits;
}

// バイト配列を16進文字列に変換
function	bytes_to_hex_string		(bytes)
{
	var	result = "";

	for (var i = 0; i < bytes.length; i++) {
		result += byte_to_hex(bytes[i]);
	}
	return result;
}

// 16進文字列をバイト値に変換
function	hex_to_byte		(hex_str)
{
	return parseInt(hex_str, 16);
}

// バイト配列を16進文字列に変換
function	hex_string_to_bytes		(hex_str)
{
	var	result = [];

	for (var i = 0; i < hex_str.length; i+=2) {
		result.push(hex_to_byte(hex_str.substr(i,2)));
	}
	return result;
}

// UTF8のバイト配列を文字列に変換
function	utf8_bytes_to_string	(arr)
{
    if (arr == null)
        return null;
    var result = "";
    var i;
    while (i = arr.shift()) {
        if (i <= 0x7f) {
            result += String.fromCharCode(i);
        } else if (i <= 0xdf) {
            var c = ((i&0x1f)<<6);
            c += arr.shift()&0x3f;
            result += String.fromCharCode(c);
        } else if (i <= 0xe0) {
            var c = ((arr.shift()&0x1f)<<6)|0x0800;
            c += arr.shift()&0x3f;
            result += String.fromCharCode(c);
        } else {
            var c = ((i&0x0f)<<12);
            c += (arr.shift()&0x3f)<<6;
            c += arr.shift() & 0x3f;
            result += String.fromCharCode(c);
        }
    }
    return result;
}


テスト用HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript">
<script src="prototype001.js"></script>
<script language="JavaScript">
<!--
	
	function test01(){
		alert('今日はいい天気です');
	}
	function test02(){
	  var bytes = string_to_utf8_bytes('今日はいい天気です');
	  alert(eval(bytes));
	}
	function test03(){
	  var bytes = string_to_utf8_bytes('今日はいい天気です');
	  alert(bytes_to_hex_string(bytes));
	}
	function test04(){
	  var bytes1 = string_to_utf8_bytes('今日はいい天気です');
	  var hex_str1 = bytes_to_hex_string(bytes1);
	  var bytes2 = hex_string_to_bytes(hex_str1);
	  alert(eval(bytes2));
	  var str2 = utf8_bytes_to_string(bytes2);
	  alert(str2);
	}
	function test05(){
	  var hex_str1 = string_to_utf8_hex_string('今日はいい天気です');
	  document.getElementById('hex_temp').innerHTML = hex_str1;
	  var str2 = utf8_hex_string_to_string(hex_str1);
	  alert(str2);
	}
//-->
</script>
</head>
<body>
<a href="#"  onClick="Javascript:test01();">試作ver001</a><br />
<a href="#"  onClick="Javascript:test02();">試作ver002</a><br />
<a href="#"  onClick="Javascript:test03();">試作ver003</a><br />
<a href="#"  onClick="Javascript:test04();">試作ver004</a><br />
<a href="#"  onClick="Javascript:test05();">試作ver005</a><br />
<br />
<span id="hex_temp"></span>
</body>
<html>

<使い方>
string_to_utf8_hex_string() = 文字列をUTF8の16進数文字列に変換します。
 例:'今日はいい天気です' → e4bb8ae697a5e381afe38184e38184e5a4a9e6b097e381a7e38199
 ※使い道としては「通信時に文字化けしてしまう」「URLセーフな文字列を送信したい」など


utf8_hex_string_to_string() = UTF8の16進数文字列を通常の文字列に変換します。
 例:e4bb8ae697a5e381afe38184e38184e5a4a9e6b097e381a7e38199  → '今日はいい天気です'
 ※16進数文字列を元に戻す。


文字化けするな馬鹿野郎!と思ったら変換しちゃいましょう(*´Д`*)ノシ