吉里吉里プラグイン util_iconv:ICONVモジュール

  1. 概要
  2. メンバ一覧

1. 概要

LIBICONVによる文字符号化変換を扱うプラグインです。このプラグインを使用するには、iconv.dll が必要です。

Windows版吉里吉里2のTJS2で扱う文字列は、内部的にUCS-2(Little Endian)で保持されています(wchar_t: Windowsの実装依存)。Shift_JISやEUC-JPなどで符号化された「文字列」は、TJS2の文字列から見ると、文字列とは解釈できないただのオクテット列です。このプラグインが提供するEncoderクラスは、TJS2文字列と符号化されたオクテット列の相互変換をサポートします。指定できる符号化方法については文字符号化方法を参照してください。

このプラグインでは、便宜的に「エンコード」「デコード」という概念を用い、次のように定義します(Perl5.8のUnicode対応を参考にしました)。

エンコード
TJS2文字列を、指定の方法で符号化し、TJS2オクテット列に変換すること。
デコード
TJS2オクテット列を、ある文字列が指定の方法で符号化された結果と見なし、TJS2文字列に変換すること。

例えば、TJS2の文字列をエンコードすることで、所謂「文字コードがShift_JIS」な状態に変換することができます。逆に、所謂「文字コードがShift_JIS」な状態のオクテット列をデコードすることで、TJS2文字列に変換することもできます。

以下にサンプルを示します。

Plugins.link('util_iconv.dll');
Plugins.link('util_generic.dll');

const OCT_UCS2LE = <% 41 00 41 00 41 00 7B 30 52 30 0A 00 E0 FF E1 FF E2 FF 0D FF 25 22 5E FF 0A 00 42 30 42 30 %>;
const OCT_SJIS   = <% 41 41 41 82 D9 82 B0 0A 81 91 81 92 81 CA 81 7C 81 61 81 60 0A 82 A0 82 A0 %>;
const STR_TJS    = "AAAほげ\n¢£¬−‖〜\nああ";

test_SJIS2TJS();
test_TJS2SJIS();

// SJIS(cp932) to TJS(ucs2le)
function test_SJIS2TJS()
{
  // MSのCP932パッチ
  Encoder.cp932patch = true;

  // 変換前のオクテット列
  System.inform(Debug.hexDump(OCT_SJIS, tpdmPlatform));

  // オクテット列を、CP932で符号化されたものと見なして
  // TJS2の文字列に変換する。
  var tjsstr = Encoder.decode('CP932', OCT_SJIS);

  // 変換後の文字列
  System.inform(tjsstr);

  // 非可逆変換が発生した場合
  if (Encoder.nonidenticals) {
    System.inform(@"非可逆変換:${Encoder.nonidenticals}文字");
  }
}

// TJS(ucs2le) to SJIS(cp932)
function test_TJS2SJIS()
{
  // MSのCP932パッチ
  Encoder.cp932patch = true;

  // 変換前の文字列
  System.inform(STR_TJS);

  // TJS文字列をCP932で符号化変換し、オクテット列として取得する。
  var cp932 = Encoder.encode('CP932', STR_TJS);

  // 変換後の文字列
  System.inform(Debug.hexDump(cp932, tpdmPlatform));

  // 非可逆変換が発生した場合
  if (Encoder.nonidenticals) {
    System.inform(@"非可逆変換:${Encoder.nonidenticals}文字");
  }
}

LIBICONVとは直接関係ありませんが、RFC3492で規定されたPunycode変換もサポートしています。符号化名'RFC3492'で変換できます。

Plugins.link('util_iconv.dll');
Plugins.link('util_generic.dll');

// xn--MajiKoi5-783gue6qz075azm5e
function test_puny()
{
  var maji = "MajiでKoiする5秒前";

  // オクテット列に変換
  var oct = Encoder.encode('RFC3492', maji);
  System.inform(Debug.hexDump(oct));

  // ASCII文字として解釈し、TJS文字列に変換
  var ascii = Encoder.decode('ASCII', oct);
  System.inform(ascii);

  // 元に戻してみる
  var rev = Encoder.decode('RFC3492', oct);
  System.inform(rev);
}

2. メンバ一覧

このプラグインをリンクすると、下記のメンバが追加されます。