作者: 閑舎
日時: 2008/1/06(00:54)
続き…。

実際は

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/