キーワード

プロフィール

深沢千尋

Author:深沢千尋
みなさんこんにちは、深沢千尋です。(公式ページ
文字コード【超】研究 改訂第2版NEW!」「すぐわかるPerl」「すぐわかる オブジェクト指向 Perl」の著者です。
ここでは、多くは技術的でないこと、ごくまれに技術的なことをなげやりに書いていきます。
メールは suguwakaruPerl@gmail.com まで。(アットマークは ASCII に)
Twitterはじめました。@query1000です。よろしく~

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

検索フォーム

RSSリンクの表示

リンク

ブロとも申請フォーム

QRコード

QRコード

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

「まるごとEncode」解題(14)オレ文字コードの自作/enc2xs を使う編

続き。
いよいよひとまずの最終回である。
Encodeモジュールを使うと自分専用の文字コードを定義することができるの続き。

2つ目は enc2xs というプログラムを使う方法。
これは、ucm ファイルという変換テーブルを入力として、新しい文字コードを生成するものである。
詳細は例によってperldocに当たれということだが、簡単には以下のように行う。

まず、ネタ元の ucm ファイルを用意する
ここでは、「まるごとEncode」解題(11)CPAN による文字コードのインストールでインストールした Encode::EUCJPMS の ucm が C:\strawberry\cpan\build\Encode-EUCJPMS-0.07-U4rv6s\ucm の下にできるので(cp51932.ucm と、cp51932.ucm の2つ)それを参考に作ってみた。
と言っても、テスト用で、ゴミみたいなファイルである。

fukazawaSmile.ucm - - - - - - ココカラ - - - - - - - - - - - - - - - - ->8
#
# fukazawaSmile

"fukazawaSmile"
1
5
\x3F

CHARMAP
\x28\x5E\x5F\x5E\x29 |0 # SMILE
END CHARMAP
- - - - - - - - - - - - - - ココマデ - - - - - - - - - - - - - - - - ->8

全部類推で書いたのだが、 は名前、 はマルチバイトの最小長、 は最大長である。
はencodeの第3引数を省略したときの代替文字で、ここでは ? を指定した。
以下CHARMAPからEND CHARMAPまでが変換テーブルである。

ここでは U+263A(例の ☺)が来たら日本式の顔文字に変換してみた。
|0 というのは Unicode とこの文字コード系のラウンドトリップコンバージョンを保証するという意味だそうだ。
# 以降は注釈である。

さて、ごちゃごちゃにならないようにこのファイル1つをフォルダに入れたら、そのフォルダで以下のコマンドを実行する。

C:\Documents and Settings\you\デスクトップ\test>enc2xs -M fukazawaSmile fukazawaSmile.ucm
Generating Makefile.PL...
Generating fukazawaSmile.pm...
Generating t/fukazawaSmile.t...
Generating README...
Generating Changes...

ちゃんとファイルが出来たか確認する。

C:\Documents and Settings\you\デスクトップ\test>tree /a /f
フォルダ パスの一覧
ボリューム シリアル番号は CC49-9896 です
C:.
| Changes
| fukazawaSmile.pm
| fukazawaSmile.ucm
| Makefile.PL
| README
|
\---t
fukazawaSmile.t

できている。

では make する。
まず makefile を作るための Perl スクリプト Makefile.PL を実行する。

C:\Documents and Settings\you\デスクトップ\test>perl Makefile.PL
enc2xs is C:\strawberry\perl\bin\enc2xs
encode.h is at C:\strawberry\perl\lib\Encode
Writing Makefile for Encode::fukazawaSmile

次に、UNIX 環境であれば % make test とするところであるが、Windows 上の Strawberry Perl 環境では dmake とすればいいだけである。
このへんがラクだね>ストパー

C:\Documents and Settings\you\デスクトップ\test>dmake test
cp fukazawaSmile.pm blib\lib\Encode\fukazawaSmile.pm
C:\strawberry\perl\bin\perl.exe C:\strawberry\perl\bin\enc2xs -"Q" -o fukazawaSmile_t.c -f fukazawaSmile_t.fnm
Reading fukazawaSmile (fukazawaSmile)
Writing compiled form
Use of uninitialized value in substr at C:\strawberry\perl\bin\enc2xs line 767,
line 11.
8 bytes in string tables
C:\strawberry\perl\bin\perl.exe C:\strawberry\perl\lib\ExtUtils\xsubpp -nolinen
umbers -typemap C:\strawberry\perl\lib\ExtUtils\typemap fukazawaSmile.xs > fukazawaSmile.xsc && C:\strawberry\perl\bin\perl.exe -MExtUtils::Command -e "mv" --fukazawaSmile.xsc fukazawaSmile.c
gcc -c -IC:\strawberry\perl\lib\Encode -s -O2 -DWIN32 -DHAVE_DES_FCRYPT -DUSE_SITECUSTOMIZE -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -DPERL_MSVCRT_READFIX -s -O2 -DVERSION=\"0.01\" -DXS_VERSION=\"0.01\" "-IC:\strawberry\perl\lib\CORE" fukazawaSmile.c
gcc -c -IC:\strawberry\perl\lib\Encode -s -O2 -DWIN32 -DHAVE_DES_FCRYPT -DUSE_SITECUSTOMIZE -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -DPERL_MSVCRT_READFIX -s -O2 -DVERSION=\"0.01\" -DXS_VERSION=\"0.01\" "-IC:\strawberry\perl\lib\CORE" fukazawaSmile_t.c
Running Mkbootstrap for Encode::fukazawaSmile ()
C:\strawberry\perl\bin\perl.exe -MExtUtils::Command -e "chmod" -- 644 fukazawaSmile.bs
C:\strawberry\perl\bin\perl.exe -MExtUtils::Mksymlists \
-e "Mksymlists('NAME'=>\"Encode::fukazawaSmile\", 'DLBASE' => 'fukazawaSmile', 'DL_FUNCS' => { }, 'FUNCLIST' => [], 'IMPORTS' => { }, 'DL_VARS' => []);"
dlltool --def fukazawaSmile.def --output-exp dll.exp
g++ -o blib\arch\auto\Encode\fukazawaSmile\fukazawaSmile.dll -Wl,--base-file -Wl,dll.base -mdll -s -L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib" fukazawaSmile.o fukazawaSmile_t.o -Wl,--image-base,0x1c140000 C:\strawberry\perl\lib\CORE\libperl510.a -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 dll.exp
dlltool --def fukazawaSmile.def --base-file dll.base --output-exp dll.exp
g++ -o blib\arch\auto\Encode\fukazawaSmile\fukazawaSmile.dll -mdll -s -L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib" fukazawaSmile.o fukazawaSmile_t.o -Wl,--image-base,0x1c140000 C:\strawberry\perl\lib\CORE\libperl510.a -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr -lwinmm -lversion -lodbc32 -lodbccp32 dll.exp
C:\strawberry\perl\bin\perl.exe -MExtUtils::Command -e "chmod" -- 755 blib\arch\auto\Encode\fukazawaSmile\fukazawaSmile.dll
C:\strawberry\perl\bin\perl.exe -MExtUtils::Command -e "cp" -- fukazawaSmile.bsblib\arch\auto\Encode\fukazawaSmile\fukazawaSmile.bs
C:\strawberry\perl\bin\perl.exe -MExtUtils::Command -e "chmod" -- 644 blib\arch\auto\Encode\fukazawaSmile\fukazawaSmile.bs
C:\strawberry\perl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0,'blib\lib', 'blib\arch')" t/*.t
t/fukazawaSmile.t .. ok
All tests successful.
Files=1, Tests=2, 1 wallclock secs ( 0.14 usr + 0.05 sys = 0.19 CPU)
Result: PASS

C:\Documents and Settings\you\デスクトップ\test>

うまくいったっぽい。
ここで「念のため各ファイルを手直しした方がよいでしょう」とあるが、ここはもうインストールしてしまう。

C:\Documents and Settings\you\デスクトップ\test>dmake install
Files found in blib\arch: installing files in blib\lib into architecture dependent library tree
Installing C:\strawberry\perl\site\lib\auto\Encode\fukazawaSmile\fukazawaSmile.bs
Installing C:\strawberry\perl\site\lib\auto\Encode\fukazawaSmile\fukazawaSmile.dll
Installing C:\strawberry\perl\site\lib\Encode\fukazawaSmile.pm
Appending installation info to C:\strawberry\perl\lib/perllocal.pod

できました。

では使ってみよう。

#! perl
# expFukazawa.pl

use utf8;
use Encode;
use FukazawaSmile::FukazawaSmile;

my $smile = chr 0x263A;
print encode('fukazawaSmile', "Let's go じゅんで~す$smile");

__END__

とでも実行してみようか。

F:\Dropbox20091029\My Dropbox\Marugoto>expFukazawa.pl > u.txt

結果を見てみよう。

u.txt - - - - - - ココカラ - - - - - - - - - - - - - - - - ->8
???????????????(^_^)
- - - - - - - - - ココマデ - - - - - - - - - - - - - - - - ->8

うん、スマイルマークしか定義していないのでほとんど ? になってしまった。

ではプログラムをこう直す。

#! perl
# expFukazawa.pl

use utf8;
use Encode;
use FukazawaSmile::FukazawaSmile;

my $smile = chr 0x263A;
print "", encode('fukazawaSmile', "Let's go じゅんで~す$smile", Encode::XMLCREF), " ";

__END__

実行はこうだ。

F:\Dropbox20091029\My Dropbox\Marugoto>expFukazawa.pl > u.html

u.html ができるのでブラウズしてみる。

20091214_html.png

あははできている。

念のためソースはこうである。

20091214_htmlsrc.png

スマイルマーク以外の字が文字参照になっているわけだ。
スポンサーサイト

<< パソコン新調 | ホーム | 「まるごとEncode」解題(12)encode 関数の第3引数 >>


コメント

コメントの投稿


管理者にだけ表示を許可する

 ホーム 


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。