LIBICONVによる文字符号化変換を扱うプラグインです。 このプラグインを使用するには、 libiconv.dll が必要です。
Windows版吉里吉里2のTJS2で扱う文字列は、内部的にUCS-2(Little Endian)で保持されています(wchar_t: Windowsの実装依存)。 Shift_JISやEUC-JPなどで符号化された「文字列」は、TJS2の文字列から見ると、文字列とは解釈できないただのオクテット列です。 このプラグインが提供するEncoderクラスは、TJS2文字列と符号化されたオクテット列の相互変換をサポートします。 指定できる符号化方法については 文字符号化方法を参照してください。
このプラグインでは、便宜的に「エンコード」「デコード」という概念を用い、次のように定義します(Perl5.8のUnicode対応を参考にしました)。
例えば、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); }
このプラグインをリンクすると、下記のメンバが追加されます。