見出し画像

Re:SALOON & VBA

HTA+Javascript 文字コード表作成

EXCEL VBA 文字コード表作成
で作成した表をHTAで作成してみました。

こっちの方が高速です。
但し、ファイルのダウンロードはされているという前提

EXCEL/VBA と同様
JIS X 0213利用者有志による、相互扶助を目的としたウェブサイト というサイトに
http://x0213.org/
・JIS X 0213:2004 漢字8ビット符号とUnicodeの対応表
http://x0213.org/codetable/jisx0213-2004-8bit-std.txt
をダウンロードして入力ファイルにしています。

HTA でダウンロードする(若しくは直接URLで読み込む)やり方が今のところ分からない。
多分、勝手にダウンロードするのは、セキュリティ上問題があるからガードされているのでは?ないかと

こちらは、縦一列では見難いので、15列に編集してます。
また、SJISコードは、編集せずです。(function追加が要るので、取り敢えずいいかと…)

//******************************************************************************
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=Shift_JIS" />
<script type="text/javascript"><!--
String.__fromCharCode__ = String.fromCharCode;
String.fromCharCode = function(){
 var buf = '';
 for ( var i = 0, l = arguments.length; i < l; i++ ) {
  var n = arguments[i];
  if ( n < 0x10000 ) {
   buf += String.__fromCharCode__(n);
   continue;
  }
  n -= 0x10000;
  buf += String.__fromCharCode__(
      0xD800 + ( n >> 10 ),
      0xDC00 + ( n & 0x3FF )
  );
 }
 return buf;
};
function init() {
 var fso = new ActiveXObject("Scripting.FileSystemObject");
 var f  = fso.GetFile("jisx0213-2004-8bit-std.txt");
 var rs = f.OpenAsTextStream();
 var str = [];
 var jis = [];
 var uni = [];
 var moj = "";
 var i  = 0; // 点
 var j  = 0; // 列
 var k  = 0; // 区
 var m  = 0; // 面
 var tmp = "";
 var strhtml = "";
 // 読込み(コメント部分読み飛ばし)
 while (!rs.AtEndOfStream) {
  str = rs.ReadLine().split("\t");
  if (str[0].slice(0,2) != "##") { break; }
 }
 strhtml = "<table border=1 cellspacing=0 cellpadding=3 style='color : black; background-color : #ffffff;'>";
 strhtml += "<tr style='color : white; background-color : #ff4500;'><th>面</th><th>区</th>";
 strhtml += "<th>JIS</th><th>00</th><th>01</th><th>02</th><th>03</th><th>04</th><th>05</th><th>06</th><th>07</th>";
 strhtml += "<th>08</th><th>09</th><th>10</th><th>11</th><th>12</th><th>13</th><th>14</th><th>15</th></font><tr>";
 for (var i=0 ; i<=95 ; i++) { jis[i] = " "; uni[i] = " "; } // 配列クリア
 while (!rs.AtEndOfStream) {
  k = str[0].slice(2,4); // 区(HEX)
// 読込み(区単位で配列に溜込む)
  while (str[0].slice(2,4) == k) {
   if (parseInt(k,16) <= 128) {
    i = (parseInt(str[0].slice(4,6),16)) - 32; // 点(10)
   } else {
    i = (parseInt(str[0].slice(4,6),16)) - 160; // 点(10)・2面
   }
   jis[i] = str[0]; uni[i] = str[1];
   if (rs.AtEndOfStream) { break; }
   str = rs.ReadLine().split("\t");
  }
  for (var i=0 ; i<=80 ; i+=16) {
  // 先頭
   if (i == 0) {
     if (parseInt(k,16) <= 128) {
      tmp = parseInt(k,16) - 32; // 区(10)
      m = 1;
     } else {
      tmp = parseInt(k,16) - 160; // 区(10)・2面
      m = 2;
     }
     strhtml += "<tr align=center><td rowspan=12 bgcolor=#CCFF" + k + "><font size=5>" + m;
     strhtml += "</font><td rowspan=12 bgcolor=#CCFF" + k +"><font size=5>" + tmp + "</font></td></td>";
     strhtml += "<td rowspan=2 bgcolor=#CCFF" + k +"><font size=4>" + jis[1] + "</font></td>";
   } else {
     strhtml += "<tr align=center><td rowspan=2 bgcolor=#CCFF" + k +"><font size=4>" + jis[i] + "</font></td>";
   }
  // 明細(文字)
   for (var j=0 ; j<=15 ; j++) {
    tmp = uni[i + j];
    if (tmp ==" ") {
     strhtml += "<td bgcolor=#dcdcdc> </td>";
    } else if (tmp =="") {
     strhtml += "<td bgcolor=#e0ffff> </td>";
    } else {
     if (tmp.length > 7) {
      moj = String.fromCharCode(parseInt(tmp.slice(2,6), 16)) + String.fromCharCode(parseInt(tmp.slice(-4), 16));
      strhtml += "<td bgcolor=#ffff00><font size=6 face='MS P明朝'>" + moj + "</font></td>";
     } else {
      if (tmp.length == 7) {
       moj = String.fromCharCode(parseInt(tmp.slice(2,7), 16));
      } else {
       moj = String.fromCharCode(parseInt(tmp.slice(2,6), 16));
      }
      strhtml += "<td><font size=6 face='MS P明朝'>" + moj + "</font></td>";
     }
    }
   }
   strhtml += "</tr><tr align=center>";
  // 明細(uni)
   for (var j=0 ; j<=15 ; j++) {
    tmp = uni[i + j];
    if (tmp ==" ") {
     strhtml += "<td bgcolor=#dcdcdc> </td>";
    } else if (tmp =="") {
     strhtml += "<td bgcolor=#e0ffff> </td>";
    } else {
     if (tmp.length > 7) {
      tmp = tmp.slice(0,6) + "<br>" + tmp.slice(6);
     }
     strhtml += '<td><font size=2>' + tmp + '</font></td>';
    }
   }
   strhtml += "</tr>";
  }
  for (var i=0 ; i<=95 ; i++) { jis[i] = " "; uni[i] = " "; } // 配列クリア
 }
 rs.close();
 strhtml += "</table>";
 document.write(strhtml);
}
/ --></script>
<body style="color : white; background-color : #000000;">
<h2 align="center">JIS UNICODE 文字コード表</h2>
<script type="text/javascript"><!--
 window.resizeTo(1090, 1000);
 init();
// --></script>
</body>
</html>

コメント一覧

ブログオーナー
参考サイト
文字コードは、以下のサイトで学習しました。
(分かりやすい)

国語の先生の為の文字コード詳説
http://homepage2.nifty.com/zaco/code/

文字コードの話
http://euc.jp/i18n/charcode.ja.html
⇒画像
追加① SJIS算定関数
http://blogimg.goo.ne.jp/user_image/23/4f/de5a2c08486050747b4bd88295f3e0ee.jpg
function jis2sjis(jis) {
 var hi = parseInt(jis.slice(2,4),16);
 var lo = parseInt(jis.slice(-2),16);
 var str = "";
 if (hi <= 128) {
  if (hi % 2) {
   hi  = ((hi + 1) / 2) + 112;
   lo  = lo + 31;
  } else {
   hi  = (hi / 2) + 112;
   lo  = lo + 125;
  }
  if (hi >= 160) { hi = hi + 64; }
  if (lo >= 127) { lo = lo + 1; }
 } else {
  if (hi % 2) {
   lo  = lo - 97;
  } else {
   lo  = lo - 2;
  }
  if (hi     < 168) {
   hi  = Math.floor((hi + 319) / 2);
  } else if (hi == 168) {
   hi  = 240;
  } else if (hi < 176) {
   hi  = Math.floor((hi + 313) / 2);
  } else {
   hi  = Math.floor((hi + 251) / 2);
  }
 }
 str = ((hi * 256) + lo).toString(16);
 return "0x" + str.toUpperCase();
}
ブログオーナー
修正② ダウンロード機能の追加の続き
// 修正①からの続き

  // 明細(文字)
   for (var j=0 ; j<=15 ; j++) {
    tmp = uni[i + j];
    if (tmp ==" ") {
     strhtml += "<td bgcolor=#dcdcdc> </td>";
    } else if (tmp =="") {
     strhtml += "<td bgcolor=#e0ffff> </td>";
    } else {
     if (tmp.length > 7) {
      moj = String.fromCharCode(parseInt(tmp.slice(2,6), 16)) + String.fromCharCode(parseInt(tmp.slice(-4), 16));
      strhtml += "<td bgcolor=#ffff00><font size=6 face='MS P明朝'>" + moj + "</font></td>";
     } else {
      if (tmp.length == 7) {
       moj = String.fromCharCode(parseInt(tmp.slice(2,7), 16));
      } else {
       moj = String.fromCharCode(parseInt(tmp.slice(2,6), 16));
      }
      strhtml += "<td><font size=6 face='MS P明朝'>" + moj + "</font></td>";
     }
    }
   }
   strhtml += "</tr><tr align=center>";
  // 明細(uni)
   for (var j=0 ; j<=15 ; j++) {
    tmp = uni[i + j];
    if (tmp ==" ") {
     strhtml += "<td bgcolor=#dcdcdc> </td>";
    } else if (tmp =="") {
     strhtml += "<td bgcolor=#e0ffff> </td>";
    } else {
     if (tmp.length > 7) {
      tmp = tmp.slice(0,6) + "<br>" + tmp.slice(6);
     }
     strhtml += '<td><font size=2>' + tmp + '</font></td>';
    }
   }
   strhtml += "</tr>";
  }
 }
 rs.close();
 strhtml += "</table>";
 document.write(strhtml);

// ファイルの削除
 if (fso.FileExists(fpath)) {
  fso.DeleteFile(fpath, true);
 } else {
  alert(fpath + " は既に削除されています");
 }
}
/ --></script>
<body style="color : white; background-color : #000000;">
<h2 align="center">JIS UNICODE 文字コード表</h2>
<script type="text/javascript"><!--
 window.resizeTo(1090, 1000);
 init();
// --></script>
</body>
</html>
ブログオーナー
修正① ダウンロード機能の追加
私のPCは、今や沈没寸前のVista(よってIE9)なので、
HTML5とかは使えないし(と思います)
ファイルのダウンロードも、きっと出来ないと思い込んでいたのですが、
ActiveX を使うことで、ファイルのダウンロードが出来ました。

使用後、ダウンロードしたファイル(TXT)は削除していますが、
残すようなら、最後のfso.DeleteFile を無効化して下さい。
速度も結構速いので、単純に出来上がっているHTMLを表示しただけ
みたいに見えます。まずまずの出来と自画自賛。

************************************************************
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=Shift_JIS" />
<script type="text/javascript"><!--
String.__fromCharCode__ = String.fromCharCode;
String.fromCharCode = function(){
 var buf = '';
 for ( var i = 0, l = arguments.length; i < l; i++ ) {
  var n = arguments[i];
  if ( n < 0x10000 ) {
   buf += String.__fromCharCode__(n);
   continue;
  }
  n -= 0x10000;
  buf += String.__fromCharCode__(
      0xD800 + ( n >> 10 ),
      0xDC00 + ( n & 0x3FF )
  );
 }
 return buf;
};
function downloadToFile(url, file) {
 var xhr = new ActiveXObject("msxml2.xmlhttp"),
   ado = new ActiveXObject("ADODB.Stream");
 xhr.open("GET", url, false);
 xhr.send();
 if (xhr.status === 200) {
   ado.type = 1;
   ado.open();
   ado.write(xhr.responseBody);
   ado.saveToFile(file);
   ado.close();
 }
}
function init() {
// ファイルのダウンロード
 var obj  = new ActiveXObject("WScript.Shell");
 var path = obj.CurrentDirectory;
 var fpath = path + "/jisx0213-2004-8bit-std.txt";
 var fso  = new ActiveXObject("Scripting.FileSystemObject");
 if (!fso.FileExists(fpath)) {
  var url = "http://x0213.org/codetable/jisx0213-2004-8bit-std.txt";
  downloadToFile(url,fpath);
// } else {
//  alert(fpath + " は既に存在しています");
 }

 var f  = fso.GetFile("jisx0213-2004-8bit-std.txt");
 var rs = f.OpenAsTextStream();
 var str = [];
 var jis = [];
 var uni = [];
 var moj = "";
 var i  = 0; // 点
 var j  = 0; // 列
 var k  = 0; // 区
 var m  = 0; // 面
 var tmp = "";
 var strhtml = "";
// 読込み(コメント部分読み飛ばし)
 while (!rs.AtEndOfStream) {
  str = rs.ReadLine().split("\t");
  if (str[0].slice(0,2) != "##") { break; }
 }
 strhtml = "<table border=1 cellspacing=0 cellpadding=3 style='color : black; background-color : #ffffff;'>";
 strhtml += "<tr style='color : white; background-color : #ff4500;'><th>面</th><th>区</th>";
 strhtml += "<th>JIS</th><th>00</th><th>01</th><th>02</th><th>03</th><th>04</th><th>05</th><th>06</th><th>07</th>";
 strhtml += "<th>08</th><th>09</th><th>10</th><th>11</th><th>12</th><th>13</th><th>14</th><th>15</th></font><tr>";
 while (!rs.AtEndOfStream) {
  for (var i=0 ; i<=95 ; i++) { jis[i] = " "; uni[i] = " "; } // 配列クリア
  k = str[0].slice(2,4); // 区(HEX)
// 読込み(区単位で配列に溜込む)
  while (str[0].slice(2,4) == k) {
   if (parseInt(k,16) <= 128) {
    i = (parseInt(str[0].slice(4,6),16)) - 32; // 点(10)
   } else {
    i = (parseInt(str[0].slice(4,6),16)) - 160; // 点(10)・2面
   }
   jis[i] = str[0]; uni[i] = str[1];
   if (rs.AtEndOfStream) { break; }
   str = rs.ReadLine().split("\t");
  }
  for (var i=0 ; i<=80 ; i+=16) {
  // 先頭
   if (i == 0) {
     if (parseInt(k,16) <= 128) {
      tmp = parseInt(k,16) - 32; // 区(10)
      m = 1;
     } else {
      tmp = parseInt(k,16) - 160; // 区(10)・2面
      m = 2;
     }
     strhtml += "<tr align=center><td rowspan=12 bgcolor=#CCFF" + k + "><font size=5>" + m;
     strhtml += "</font><td rowspan=12 bgcolor=#CCFF" + k +"><font size=5>" + tmp + "</font></td></td>";
     strhtml += "<td rowspan=2 bgcolor=#CCFF" + k +"><font size=4>" + jis[1] + "</font></td>";
   } else {
     strhtml += "<tr align=center><td rowspan=2 bgcolor=#CCFF" + k +"><font size=4>" + jis[i] + "</font></td>";
   }

// 修正②に続く
名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

※ブログ作成者から承認されるまでコメントは反映されません。

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最新の画像もっと見る

最近の「HTA」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事