LANG SELRCT

コードを書く場所についてはこちら

2018年3月21日水曜日

文字をUTF16にして16進数にしてシートに書き出す


A列にこのように文字が入っていて


UTF16に変換してB列に入力して
16進数に変換してC列に入力する



コード.gs
function str_utf16_hexadecimal() {
  var values = get_values();
  var result = [];
  for(var i = 0; i < values.length; i++){
    var str = values[i].toString()
    var utf16 = get_utf16(str);
    var hexdecimal = get_hexdecimal(utf16);
    result.push([utf16, hexdecimal]);
  }
  set_values(result);
}

function get_values(){
  var sh = SpreadsheetApp.getActiveSheet();
  var last_row = sh.getLastRow();
  var range = sh.getRange("A2:A" + last_row);
  var values = range.getValues();
  return values;
}

function get_utf16(str) {
  var array = [];
  var low = "";
  if (str.length == 2) {
    var high = str.charCodeAt(0);
    var low = str.charCodeAt(1);
    var utf16 = high + " " + low;
  } else {//サロゲートペア以外なら
    var utf16 = str.charCodeAt(0);
  }
  array.push(utf16);
  return array;
}

function get_hexdecimal(utf16) {
  var surrogates = false;
  var hexdecimal = "";
  var str_split = utf16.toString().split(" ");
  if (str_split.length == 2) {
    surrogates = true;
  }
  if (surrogates == true) {
    var high = "0x" + parseInt(str_split[0]).toString(16);
    var low = "0x" + parseInt(str_split[1]).toString(16);
    hexdecimal = high + " " + low;
  } else {
    hexdecimal = "0x" + parseInt(utf16).toString(16);
  }
  return hexdecimal;
}

function set_values(array){
  var sh = SpreadsheetApp.getActiveSheet();
  var start_row = 2;
  var start_col = 2;
  var num_rows = array.length;
  var num_cols = array[0].length;
  var range = sh.getRange(start_row, start_col, num_rows, num_cols);
  range.setValues(array); 
}

意訳
この機能がやること
get_values()から値を取得して
結果を入れる配列を用意して
値の数だけ以下を繰り返す
値をひとつずつ文字列にして
get_utf16(str)に渡して
get_hexdecimal(utf16)に渡して
resultに追加する

resultをset_values()に渡す


この機能がやること
アクティブシートを取得して
データが入っている最終行を取得して
A2から最終行までを範囲指定して
値をすべて取得して
返す


この機能がやること
結果を入れる配列を用意して
サロゲートペアの後半を入れる入れ物を用意して
もし渡された文字がサロゲートペアなら
前半部分をUTF16にして
後半部分をUTF16にして
前後半を半角スペース入れてつなげる
サロゲートペア以外なら
渡された文字をUTF16にして

UTF16の値をarrayに追加して
返す


この機能がやること
サロゲートペアのフラグをfalseにしておく
16進数の結果を空にしておく
渡されたutf16を文字列にして半角スペースで区切る
もし2つ以上(サロゲートペア)なら
surrogatesフラグをtrueにする

もしsurrogatesフラグがtrueなら
区切った前半を16進数にして
区切った後半を16進数にして
半角スペースを挟んでつなげる
サロゲートペアじゃなければ
渡されたutf16を16進数にして

16進数の値を返す


この機能がやること
アクティブシートを取得して
入力する先頭の行を指定して
入力する先頭の列を指定して
入力する行数を指定して
入力する列数を指定して
入力する範囲を指定して
入力する




関連記事

文字列をUTF-16に変換する
文字列⇔UTF16⇔16進数の相互変換をする(サロゲートペア非対応)
文字列⇔UTF16⇔16進数の相互変換をする(サロゲートペア対応)
文字列→UTF16→16進数→文字列に変換する