新規記事投稿 フォロー記事投稿 記事のキャンセル
From: にあ <nir@mxa.meshnet.or.jp>
Subject: Re: Perlでの漢字表示
Date: 1997/09/16 11:46:46
Reference: mesh.program/00377

9月12日に、Kazさんは書きました。

> Perlで漢字を表示しようとするとうまく表示されないものがあります。
>
> 予定表 がそうです。
>
> \を前に書くとうまくいくのを聞いたことがあるので、 予\定\表
>とやってみたら、
>
> 予定・ としか表示されません。
>
これは漢字コードにSJISを使っている時の事ですよね。

例えば '表' の漢字コードはSJISで書くと "\x95\x5C" となり "\x5C" つまり '\' と
言う文字が漢字の2バイト目に現われることになります。

ご存じでしょうが、perlにおいて '\' と言う文字はエスケープ文字として
使われますので、例えば "表1" とか書くと、"表" の2バイト目の '\' が
"1"("\x82\x50") の 1バイト目の "\x82" をエスケープする事になり、
(エスケープしても特にコードは変わらないが) '\' 自体は無くなってしまうので
"\x95\x82\x50" となり、'浮P' などと表示されることになります。

と言うことで、これら2バイト目に "\x5C" が来る漢字による文字化けを
防ぐときには、"表\1" の様にその漢字の後ろに '\' を付けてやって、
"\\" と続くようにして、'\' が消えるのを防ぐか、生に "\x95\x5C" の
様に漢字コードを書きます。

また、そもそも、"漢字" の様にダブルクォートで括る必要が無い
(文字列中の変数展開、エスケープ処理などが必要無い) なら、
'表' の様にシングルクォートで括ってやれば、エスケープ処理は
しないわけですから、小細工は必要有りません。

# ただし、シングルクォートで括った場合でも、問題の漢字が '予定表' の
# 様に最後に来ると、終わりの "'" をエスケープしてしまって文法エラーに
# なってしまうので、'予定表\' の様にする必要はありますが。

あ、簡単な解を忘れていました。漢字コードに EUC を使えば良いです。
EUC は常に bit7 が立っていますから、perl の特殊記号にマッチする
気遣いは無いです。(^^)