|
>>>2202 スナフキン >man rpm をどうぞ。 すいません。言葉足らずでした。 xntp はインストールされてなかったので、 ntp はソースから make install しました。 その場合のインストールされたファイルを知りたかったのです。 ntp を削除して、管理しやすい xntp(ntp-4.0.99-15〜.rpm)を インストールしようとおもってます。 |
|
ええと,結局,最新版jcode.plでも半角カナは文字化けしました。 たまたま「シイ」はOKでしたが「アイウエオ」はNGでした。 こちらの掲示板でもたぶん化けると思います。 そこで,前に書いた方法をスクリプトにしてみました。 尚,送信ページには,↓この1行が入っています。 <INPUT TYPE="hidden" NAME="assist" VALUE=" "> VALUEは,全角スペース5個です。 −−−− # コード判別補助文字列名(送信ページと統一,半角英数字に限る) $assi = 'assist'; read(STDIN,$input,$ENV{'CONTENT_LENGTH'}); @parts = split(/&/,$input); # コード判別補助文字列$ASSIST0の取得 foreach(@parts) { ($key0,$val0) = split(/=/); # 最初の=で分離 $key0 =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; if ($key0 eq "$assi") { $ASSIST0 = $val0; } } foreach(@parts) { ($key,$val) = split(/=/); # 最初の=で分離 $val =~ tr/+/ /; # trは1文字単位の置換 # コード判別補助文字列の追加 if ($key ne "$assi") { $val = $val.$ASSIST0; } $key =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; jcode::convert(\$key,'euc');#---- from jcode.pl jcode::convert(\$val,'euc');#---- from jcode.pl if ($key eq "$ass") { $ASSIST = $val; } $val =~ s/($ASSIST)$//g; # コード判別補助文字列の除去 $key =~ s/\r\n|\r|\n//g; # gはマッチする文字全て $val =~ s/\r\n|\r|\n//g; $key =~ s/,/,/g; $val =~ s/,/,/g; $key =~ s/</</g; $val =~ s/</</g; $key =~ s/>/>/g; $val =~ s/>/>/g; $key =~ s/"/”/g; $val =~ s/"/”/g; $key =~ s/&/&/g; $val =~ s/&/&/g; $in{$key} = $val; } −−−− これで「ア」などという1文字の半角カナもコード判別できているようです。 もうちょっとスッキリできればいいのですが……。 |
|
>>2204 shii http://www.din.or.jp/~ohzaki/perl.htm#JP_Code っていうかそのコードには 気になる点がいろいろと・・・ |
|
>>2205 ナナシサソ リンク先はPerlメモのgetcode関数のところですね。 できれば気になる点を具体的に指摘していただけると とてもありがたいのですが。 |
|
>>2204 shii 考え方はよいのですが、もちっとスマートにやるなら、 「あ」の文字コードを調べるスクリプト require 'jcode.pl'; $_="あ"; jcode::convert(\$_, 'euc'); s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; print "あ in euc-jp: $_\n"; $_="あ"; jcode::convert(\$_, 'sjis'); s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; print "あ in shift_jis: $_\n"; $_="あ"; jcode::convert(\$_, 'jis'); s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; print "あ in jis: $_\n"; 実行結果: あ in euc-jp: %A4%A2 あ in shift_jis: %82%A0 あ in jis: %1B%24B%24%22%1B%28B # これは他のパターンも有りうるかも を踏まえて、 <input type="hidden" name="assist" value="あ"> としておき、 read(STDIN,$input,$ENV{'CONTENT_LENGTH'}); ($assist_code) = $input =~ s/(^|&)assist=(.*?))($|&)//; if ( $assist_code =~ m/^\%A4\%A2$/i ){ $input_encoding = 'euc'; } elsif ( $assist_code =~ m/^\%82\%A0$/i ){ $input_encoding = 'sjis'; } elsif ( $assist_code =~ m/^\%1B\%24B\%24\%22\%1B\%28B$/i ){ $input_encoding = 'jis'; } @parts = split(/&/,$input); foreach(@parts) { ($key,$val) = split(/=/); $key =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; jcode::convert(\$key,'euc', $input_encoding); jcode::convert(\$val,'euc', $input_encoding); } くらいがよろしいかと思います (動作確認はしていません)。 >>2203 AGE > ntp はソースから make install しました。 > その場合のインストールされたファイルを知りたかったのです。 もし Makefile に uninstall とか deinstall とかいうターゲットがあるなら、 # make uninstall # make deinstall ですが、なさそうならば # make -n install して、インストールされるファイルをメモって、手動で rm ですね。 >>2202 スナフキン > ServletもCGIと同じくリクエスト毎に起動するのですか? いいえ、しません。そういう意味では常駐していますね。 しかし、CGI を使うときも apache が常駐していますが、「常駐 システムを開発している」という意識は僕にはありません。それと 同様に、Servlet コンテナが常駐していても「常駐システム」とは 呼ばないんじゃないなぁ、ということです。まぁ、ここらへんの 感覚は人によって違うのかもしれません。 >>2200 /tk > どちらもスライスだと思うのですが えっと、@a[0] と (@a)[0] は違うんですよね? ということです。 要は、 「@a[0] は文法エラーのところを perl があえて $a[0] に読み変えている」 とこれまで思っていたのですが、 「@a[0] は文法的には正しいけれど、$a[0] の方が適当なので perl があえて警告するようにしている」 ということでしょうか? > @a は配列のスライスで, (@a) はリストのスライスかと… perl に配列とリストという区別はあるんでしたっけ。 |
|
>>2207 68user おお,なるほど!ありがとうございます。 ダミーを送るのなら,それをわざわざ対象文字列に結合しなくても いいわけですね。私が間抜けでした。 文字コードを調べるスクリプトが面白いですね(勉強になります)。 今回の件を自分のCGI向けに最小限にカスタマイズした(つもりの) スクリプトが下記です。 #--------------------------------------------------------- read(STDIN,$input,$ENV{'CONTENT_LENGTH'}); @parts = split(/&/,$input); foreach(@parts) { ($key,$val) = split(/=/); $val =~ tr/+/ /; $key =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $code = &jcode::getcode(\$key); jcode::convert(\$key,'euc',$code); jcode::convert(\$val,'euc',$code,"z"); $val =~ s/\r\n|\r|\n//g; $val =~ s/,/,/g; $in{$key} = $val; } #--------------------------------------------------------- 入力項目名に半角カナ以外の日本語を使用することが前提なので, 汎用性はありません。 getcode関数を全項目に使っているところが余分なのですが, 見た目は,以前に比べてすっきりしました。 ところで, > ($assist_code) = $input =~ s/(^|&)assist=(.*?))($|&)//; ここはassistの中身のみを残して残りを消す作業だと思うのですが, ($assist_code)にカッコがついている理由と, 正規表現内のカッコの数が合わない理由を教えてください。 ・「行の先頭」または「&の直後」にある「assist=」 ・「任意の1文字の0回以上の最短マッチ」 ・「行の終わり」または「&の直前」 と,部分的にしか理解できませんでした。 |