キーワード

プロフィール

深沢千尋

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

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

検索フォーム

RSSリンクの表示

リンク

ブロとも申請フォーム

QRコード

QRコード

スポンサーサイト

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

「まるごとEncode」解題(12)encode 関数の第3引数

続き。
これまで何回か出てきたが、encode関数には第3引数が渡せる。
以下のプログラムを参照。

#! perl
# encodeSmile.pl -- EUC-JPに該当する文字がない場合(UTF-8で保存)。

use strict;
use warnings;
use Encode;
use utf8;

my $smile = chr 0x263A;
print encode('eucjp', "じゅんで~す$smile\n");
print encode('eucjp', "じゅんで~す$smile\n", Encode::XMLCREF);
print encode('eucjp', "じゅんで~す$smile\n", Encode::PERLQQ);
print encode('ascii', "じゅんで~す$smile\n", Encode::XMLCREF);

__END__

ここでは 0x263A と言う字を含む文字列を encode で EUC-JP に変換している。

U+263AというUnicodeはUnihan Databaseを見れば分かるが☺である。
ちなみに上の文字は「☺」と文字参照を使って書いた。
当然 EUC-JP の文字レパートリーにはないので、失敗する。

ちなみに、ちょっとヘンな感じがする。
UTF-8 なのだから 0xE298BA なのでは?
違う。
これはperlfuc の chrの項を見れば分かるが、Unicode スカラー値を 16 進数で渡せばいいのである。
だから

my $smile = \x{263A};

と一緒である。

では実行。

F:\Dropbox20091029\My Dropbox\Marugoto>encodeSmile.pl > e.txt

ーe.txtー コ コ カ ラ ー ー ー ー ー ー>8
じゅんで?す?
じゅんで~す☺
じゅんで\x{ff5e}す\x{263a}
じゅんで~す☺
ー ー ー コ コ マ デ ー ー ー ー ー ー>8

(※便宜上アンパサンドを全角にしています)

そう、~も失敗しているのである。
これは想定内だ。
Encode::EUCJPMSも追加する。

#! perl
# encodeSmile.pl -- EUC-JPに該当する文字がない場合(UTF-8で保存)。

use strict;
use warnings;
use Encode;
use Encode::EUCJPMS; # ★変更点
use utf8;

my $smile = chr 0x263A;
print encode('eucJP-ms', "じゅんで~す$smile\n"); # ★変更点
print encode('eucJP-ms', "じゅんで~す$smile\n", Encode::XMLCREF); # ★変更点
print encode('eucJP-ms', "じゅんで~す$smile\n", Encode::PERLQQ); # ★変更点
print encode('ascii', "じゅんで~す$smile\n", Encode::XMLCREF);

__END__

再実行。

F:\Dropbox20091029\My Dropbox\Marugoto>encodeSmile.pl > e.txt

ーe.txtー コ コ カ ラ ー ー ー ー ー ー>8
じゅんで~す[Z]
じゅんで~す☺
じゅんで~す\x{263a}
じゅんで~す☺
ー ー ー コ コ マ デ ー ー ー ー ー ー>8

(※便宜上アンパサンドを全角にしています)

では1行1行検証してみよう。

print encode('eucJP-ms', "じゅんで~す$smile\n"); # ★変更点



じゅんで~す[Z]

になっている。
これ、実際には Windows のエディタ上では黒い四角に白抜きで Z といういかつい字で、0x1A だ。
さっきまでは変換できない文字は ? (0x3F) だった。
これは、この連載の(14)に出てくるが、eucJP-ms のモトになっている ucm という変換テーブルファイルの先頭で指定されている。
ウチの環境では
C:\strawberry\cpan\build\Encode-EUCJPMS-0.07-U4rv6s\ucm\eucJP-ms.ucm
というファイルであるが、

\x1A

という業で指定されているようだ。

続き。

print encode('eucJP-ms', "じゅんで~す$smile\n", Encode::XMLCREF); # ★変更点



じゅんで~す☺

になっている。

これは、U+263A を16進数文字参照☺になっているのだ。

print encode('eucJP-ms', "じゅんで~す$smile\n", Encode::PERLQQ); # ★変更点



じゅんで~す\x{263a}

になっている。これは Perl の16進表記になっている。
詳しくはperldoc Handling Malformed Data (奇形データの取り扱い)に書かれている。

print encode('ascii', "じゅんで~す$smile\n", Encode::XMLCREF);

が面白くて

じゅんで~す☺

になっている。
ここで U+3058は「じ」、U+3085は「ゅ」、U+3093は「ん」だから、ひらがなが全部文字参照化されている。
これは、第1引数が ascii になっているからで、ASCII 以外の文字は全部文字参照化される。
究極の文字化け対策である。
こういうサイトたまにありますな。
スポンサーサイト

<< 「まるごとEncode」解題(14)オレ文字コードの自作/enc2xs を使う編 | ホーム | 「まるごとEncode」解題(11)CPAN による文字コードのインストール >>


コメント

コメントの投稿


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

 ホーム 


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