Jcode.pmをWindows 2000でコンパイルする


2004.12.24 高橋 誠

 Jcode.pm - jcode.pl の後継が提供されています。性能を確保するために、XSモジュールというのが追加されました。Windows用のロードは提供されず、ソースのみの提供となっています。これをMicrosoft VC++ 6.00でコンパイルしたので報告します。また、コンパイルしたロードモジュールを提供します。

目次

変換テーブルについて

 Jcode.pmはUnicode Consortiumが1994年に提供したJISコードとunicodeの対応表に、ほぼ、基づいてコード変換しています。このコード変換はUnicode Consortium自身が認めているように、Windowsの実装とは食い違っています。例えば、Unicode 5.0によると、U+301Cは、

もともとJIS C 6226-1978の句点1-33に対応させるように意図されていたが、JISやいくつかの実装とは異なっている。

This character was encoded to match JIS C 6226-1978 1-33 “wave dash”. The JIS standards and some industry practice disagree in mapping.

とあります。そうなら変換テーブルも更新すればいいようなものですが、何か訳の分からない理屈があるようです。次の表の通り、更新されているプログラムはみな、1994年の変換表を使わずに変換しています。
 また、~(07/14)はuriによく使われていますが、1994年の変換テーブルで変換するとU+203Eになります。これではuriとして不正になってしまいます。

主なプログラムの日本語コードとunicodeの対応
区点 文字 FrontPage Express/
xyzzy/
Aprotool TM Editor/
JVim/
EmEditor/
Netscape Composer 4.72/
Mozilla/
秀丸エディタ
Netscape Composer 4.7以前/
Meadow
Uniedit
05/12 \ U+005C U+00A5 U+005C
07/14 ~ U+007E U+203E U+007E
01-32 U+FF3C U+005C U+005C
01-33 U+FF5E U+301C U+301C
01-34 U+2225 U+2016 U+2016
01-61 U+FF0D U+2212 U+2212
01-81 ¢ U+FFE0 U+00A2 U+00A2
01-82 £ U+FFE1 U+00A3 U+00A3
02-44 ¬ U+FFE2 U+00AC U+00AC

 Jcode.pmのコード変換テーブルをよく使われる対応にあわせるため、Jcode-0.88.zipをc:\に「ディレクトリ付き」で解凍してできる、c:\Jcode-0.88\unicode\euc2uni.hとc:\Jcode-0.88\unicode\uni2euc.hに次の変更を行いました。

 また、JIS X 0212とのマッピングについても、2-23チルドと2-35破断線で異なっています。2-23をU+FF5Eにすると01-33と重なるので、Spacing Modifier LettersのSmall Tilde:U+02DCに変更しました。

eucからunicodeへの変換テーブル(euc2uni.h)の改造
句点 文字euc変更前変更後
文字名前unicode文字名前unicode
JIS X 0201
05/12\0x5c\Yen SignU+00A5¥Reverse SolidusU+005C
07/14~0x7eOverlineU+203E~TildeU+007E
JIS X 0208
01-320xa1c0Fullwidth Reverse SolidusU+FF3CFullwidth Reverse SolidusU+FF3C
01-330xa1c1Wave DashU+301CFullwidth TildeU+FF5E
01-340xa1c2Double Vertical LineU+2016Parallel ToU+2225
01-610xa1ddMinus SignU+2212Fullwidth Hyphen-MinusU+FF0D
01-81¢0xa1f1¢ Cent SignU+00A2Fullwidth Cent SignU+FFE0
01-82£0xa1f2£ Pound SignU+00A3Fullwidth Pound SignU+FFE1
02-44¬0xa2cc¬Fullwidth Not SignU+00ACNot SignU+FFE2
JIS X 0212
02-23˜0x8fa2b7~ TildeU+007E˜Small Tilde(*1)U+02DC
02-350x8fa2c3¦Broken BarU+00A6Fullwidth Broken BarU+FFE4
unicodeからeucへの変換テーブル(uni2euc.h)の改造
unicode文字名前変更前変更後
euc句点文字euc句点文字
U+005C\Reverse Solidus0x5c05/12\0x5c05/12\
U+007E~Tilde0x7e07/14~0x7e07/14~
U+00A2¢Cent Sign0xa1f101-81¢0xa1f101-81¢
U+00A3£Pound Sign0xa1f201-82£0xa1f201-82£
U+00A5¥Yen Sign0x5c05/12\0x5c05/12\
U+00A6¦Broken Bar0x8fa2c302-350x8fa2c302-35
U+00AC¬Not Sign0xa2cc02-44¬0xa2cc02-44¬
U+02DC˜Small Tilde(*1)0x8fa2b702-23˜
U+2016Double Vertical Line0xa1c201-340xa1c201-34
U+203EOverline0x7e07/14~0x7e07/14~
U+2212Minus Sign0xa1dd01-610xa1dd01-61
U+2225Parallel To0xa1c201-34
U+301CWave Dash0xa1c101-330xa1c101-33
U+FF0DFullwidth Hyphen-Minus0xa1dd01-61
U+FF3CFullwidth Reverse Solidus0xa1c001-320xa1c001-32
U+FF5EFullwidth Tilde0xa1c101-33
U+FFE0Fullwidth Cent Sign0xa1f101-81¢
U+FFE1Fullwidth Pound Sign0xa1f201-82£
U+FFE2Fullwidth Not Sign0xa2cc02-44¬
U+FFE4Fullwidth Broken Bar0x8fa2c302-35

註1 CP932では、U+FF5Eにマッピングしていますが、01-33と衝突するので、Spacing Modifier LettersのSmall Tilde:U+02DCに変更しました。

コンパイル

 Visual C++ 6.0をインストールして、(プログラム)-(アクセサリ)-(コマンドプロンプト)で、Visual C++をインストールしたC:\Program Files\Microsoft Visual Studio\VC98\binに移動します。ここで、vcvars32.batを実行して環境変数を設定します。インストール時に「環境変数を設定しますか?」と聞かれて「はい」と答えても実は入っていないようです。
C:>cd \Program Files\Microsoft Visual Studio\VC98\bin
C:\Program Files\Microsoft Visual Studio\VC98\bin>vcvars32.bat
Setting environment for using Microsoft Visual C++ tools.
 次にjcode.pmを解凍したフォルダに移動し、perl makefile.plを実行します。
C:\Program Files\Microsoft Visual Studio\VC98\bin>cd \
C:\>cd jcode-0.88
C:\jcode-0.88>perl makefile.pl
Checking if your kit is complete...
Looks good
Writing Makefile for Jcode::Unicode
Writing Makefile for Jcode
となれば、コンパイルの準備ができています。ここで、nmakeを実行すればコンパイルできるはずなのですが、
Microsoft (R) Program Maintenance Utility   Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.

cl -c  -O1 -MD -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DPERL_MSVCRT_READFIX -O1 -MD -DNDEBUG      -DVERSION=\"0.59\"  -DXS_VERSION=\"0.59\"  -IC:\perl\lib\CORE  Unicode.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

Unicode.c
"Running Mkbootstrap for Jcode::Unicode ()"
C:\perl\bin\Perl.exe -IC:\perl\lib -IC:\perl\lib -MExtUtils::Command -e chmod 644 Unicode.bs
link -out:..\blib\arch\auto\Jcode\Unicode\Unicode.dll -dll -nologo -node faultlib -release  -libpath:"C:\perl\lib\CORE"  -machine:x86 Unicode.obj   C:\perl\lib\CORE\perl56.lib oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib msvcrt.lib -def:Unicode.def
ライブラリ ..\blib\arch\auto\Jcode\Unicode\Unicode.lib とオブジェクト ..\blib\arch\auto\Jcode\Unicode\Unicode.exp を作成中
C:\perl\bin\Perl.exe -IC:\perl\lib -IC:\perl\lib -MExtUtils::Command -e chmod 755 ..\blib\arch\auto\Jcode\Unicode\Unicode.dll
C:\perl\bin\Perl.exe -IC:\perl\lib -IC:\perl\lib -MExtUtils::Command -e cp Unicode.bs ..\blib\arch\auto\Jcode\Unicode\Unicode.bs
C:\perl\bin\Perl.exe -IC:\perl\lib -IC:\perl\lib -MExtUtils::Command -e chmod 644 ..\blib\arch\auto\Jcode\Unicode\Unicode.bs
C:\jcode-0.88>
とオブジェクトができました。

テスト

 これをテストするのですが、
C:\jcode-0.88>nmake test
t\convert...........ok
t\getcode...........ok
t\h2z...............ok
t\length............ok
t\mime..............ok
t\new...............ok
t\tr................ok
All tests successful.
Files=7, Tests=126,  8 wallclock secs ( 0.00 cusr +  0.00 csys =  0.00 CPU)
'No tests defined for Jcode::Unicode extension.'
C:\jcode-0.88>
となればokです。

インストール

 nmake installでperlの中に組み込み使用可能になります。
C:\Jcode-0.88>nmake install

Microsoft (R) Program Maintenance Utility   Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.

Installing C:\perl\site\lib\auto\Jcode\Unicode\Unicode.dll
Installing C:\perl\site\lib\auto\Jcode\Unicode\Unicode.lib
Installing C:\perl\site\lib\auto\Jcode\Unicode\Unicode.exp
Installing C:\perl\site\lib\auto\Jcode\Unicode\Unicode.bs
Installing C:\perl\site\lib\mac_install.pl
Installing C:\perl\site\lib\win_install.pl
Installing C:\perl\site\lib\Jcode.pm
Installing C:\perl\site\lib\Jcode\Tr.pm
Installing C:\perl\site\lib\Jcode\H2Z.pm
Installing C:\perl\site\lib\Jcode\Constants.pm
Installing C:\perl\site\lib\Jcode\_test.pl
Installing C:\perl\site\lib\Jcode\Unicode.pm
Installing C:\perl\site\lib\Jcode\Unicode\Constants.pm
Installing C:\perl\site\lib\Jcode\Unicode\NoXS.pm
Writing C:\perl\site\lib\auto\Jcode\.packlist
Appending installation info to C:\perl\lib/perllocal.pod

C:\Jcode-0.88>
 念のため、ロードモジュールがないときに動作するC:\perl\site\lib\jcodeの下のUnicodeフォルダを削除してもutf-8のページをHTML Lintでチェックできたので正しく動作しているようです。

ダウンロード

 コンパイル結果とロードモジュールを使う場合に必要なモジュールだけを纏めて圧縮ファイルを作りました。jcwin-0.88.zipをご利用ください。旧バージョンjcwin-0.87.zipもしばらく置いておきます。
 Perl 5.8の場合は、本来encodeに移行するべきなのですが、Perl 5.8上でコンパイルしたjcwin8-0.88.zipでも動作するようです。

 lhmletで解凍する場合、「ディレクトリ付き」で解凍して、perlを組み込んだボリューム、例えばc:\を指定すれば組み込めるはずです。c:\perlのような標準でない名称のディレクトリにperlが組み込んである場合は、解凍した場所から対応するディレクトリにコピーしてください。ソースの差分と異なるモジュールをjcodediff.zipとしておいています。

参考文献

既存の日本語文字コードと Unicode の間のマッピングルール Windowsにおける変換を参考にさせていただきました。

ホーム(x)