続き…。
実際は
use Jcode;
$str = "いろいろ’機能'を使いたい";
$str = jcode($str)->euc;
$ASCIIL = '[\x00-\x09\x0b-\x0c\x0e-\x7f]';
$TWOBYTES = '[\x8e\xa1-\xfe][\xa1-\xfe]';
$THREEBYTES = '\x8f[\xa1-\xfe][\xa1-\xfe]';
$str =~ s/^(($ASCIIL|$TWOBYTES|$THREEBYTES)*)’/\1\'/g;
print "$str\n";
ですね($EUCKANJI はまず使わないだろうということで)。
今回は久しぶりに Perl で CGI のインターフェースを書いていて、
print <<EOD;
<input type='text' name='hoge' value='$str'>
EOD
のようなコードの $str の中にユーザが書くかもしれない ' が入るとまずいの
で直前に
$str =~ s/'/’/g;
と変換しておき(\x01 に変換とかも考えたものの後遺症があるとまずいかとブラ
ウザでほとんど見分けのつかない’に変換)、POST|GET で受け取った’を元に戻
す(ユーザ側は’を必ず'で代用)というポリシーで全体をほぼ書き終え、テスト
運用していたところ不具合を見つけ、トレースして今回のタイトルに行き着いた
という次第でした。
どうもありがとうございました。
--
本田博通(閑舎)
テキストとスクリプトの http://www.rakunet.org/TSNET/