【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進数文字列を元に戻す。
文字化けするな馬鹿野郎!と思ったら変換しちゃいましょう(*´Д`*)ノシ