@blog.justoneplanet.info

日々勉強

Unicode 6.0の絵文字のソースをコード内で扱える形式に変換する

自分用のメモ。元データをJavaやJavaScript内で扱える形式に変換する。以下のようにnodeで実装した。

var fs = require('fs');
var csv = require('csv');
csv()
.from.stream(fs.createReadStream(__dirname+'/EmojiSources.txt'), {"delimiter" : ";"})
.to.path(__dirname+'/sample.txt')
.transform(function(row){
  var elm = row.slice(0, 1); 
  if (elm[0].indexOf('1F') > -1) {
    var code = parseInt("0x" + elm[0], 16);
    code -= 0x10000;
    var hi = code >> 10; 
    var lo = code & 0x3FF;
    hi |= 0xD800;
    lo |= 0xDC00;
    elm[0] = '\\u' + hi.toString(16) + '\\u' + lo.toString(16);
    elm[1] = String.fromCharCode(hi, lo);
  }
  else {
    elm[1] = String.fromCharCode(parseInt(elm[0], 16));
    elm[0] = '\\u' + elm[0] + ''; 
  }
  return elm;
})
.on('record', function(row,index){
  console.log('#' + index + ' ' + JSON.stringify(row));
})
.on('close', function(count){
  console.log('Number of lines: '+count);
})
.on('error', function(error){
  console.log(error.message);
});

ちなみに適当なファイルをUnicodeエスケープシーケンスに変換するには次のように行う。

var fs = require('fs');
var csv = require('csv');

var combine = function(str, index) {
  var code = str.charCodeAt(index);
  if (isNaN(code)) return ""; 
  return '\\u' + (new Array(4 - code.toString(16).length + 1)).join("0") + code.toString(16) + combine(str, ++index);
}

csv()
.from.stream(fs.createReadStream(__dirname+'/src.txt'), {"delimiter" : ","})
.to.path(__dirname+'/dist.txt')
.transform(function(row){
  var elm = row.slice(0, 1); 
  return '"' + combine(elm[0], 0) + '",\n';
})
.on('record', function(row,index){
  console.log('#' + index + ' ' + JSON.stringify(row));
})
.on('close', function(count){
  console.log('Number of lines: '+count);
})
.on('error', function(error){
  console.log(error.message);
});

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment