練炭ブログ

萌え壁紙、Irvine、DMonkey、Proxomitron などの情報を扱ってます。

DMonkey: iconv.dll による文字列変換

コメントなし»

KaoriYa さんが配布している Vim に同梱されている iconv.dll を使って、Irvine のスクリプトで UTF-8 文字列を Shift_JIS に変換するテスト。

function iconvUtf8ToSjis (text) {
	var Dorothy = { path: 'C:\bin\Irvine\Dorothy2\' };

	var dll = Dorothy.path + 'bin\iconv.dll';

	var d = new DynaCall ();
	d.register (dll, 'libiconv_open',	'i=ss',		'r=l');
	d.register (dll, 'libiconv_close',	'i=l',		'r=l');
	d.register (dll, 'libiconv',		'i=lssss',	'r=l');

	var n;

	var iconv = d.libiconv_open ('Shift_JIS//IGNORE', 'UTF-8');
	// alert ('libiconv_open: ' + iconv);

	var insb = new StringBuffer (text);
	var inbufp = new Struct ('inbuf:s');
	inbufp.inbuf = insb;

	var inbytesleftp = new Struct ('inbytesleft:l');
	inbytesleftp.inbytesleft = new Number (insb.length);

	var outsb = new StringBuffer (100);
	var outbufp = new Struct ('outbuf:s');
	outbufp.outbuf = outsb;

	var outbytesleftp = new Struct ('outbytesleft:l');
	outbytesleftp.outbytesleft = new Number (outsb.length);

	n = d.libiconv (iconv, inbufp, inbytesleftp, outbufp, outbytesleftp);
	// alert (n + "\n\n" + outbytesleftp.outbytesleft + "\n\n" + outsb.text);

	n = d.libiconv_close (iconv);
	// alert ('libiconv_close: ' + n);

	return outsb.text;
}

var t = String.fromCharCode (0x61, 0xF0, 0xA0, 0xAE, 0xB7, 0x7a);
alert (iconvUtf8ToSjis (t));

てきとうに書いたのでバッファの扱いとか間違っているかもしれません。Irvine の動作自体がおかしくなる恐れもあるので、このコードは実行しないで下さい。

変換できない文字を米印※とかゲタ〓のような任意の文字に変換できればよかったんですが、変換自体をエラーにするか文字を無視するかしか選べないようです。