|
大ショックです。 jcode.plを最新版(v 2.13 2000/09/29)に入れ替えたら 半角カナを認識しました。それだけのことだったのです。 大解決です。ここまでたどりつけたのも皆様のおかげです。 ありがとうございました。 それから,いろいろと変なことを書いたりやったりして すみませんでした。 ちなみに下に書いた私が使っていたjcode.plのバージョンは, 中に書いてあった記述をそのままコピーして貼ったのですが, ちょっと変ですね(^^; |
|
思わず,半角カナを認識したと書きましたが,正確には違うようです。 半角カナのsjisとeucは判別しようがないですよね。 中の説明には特に書かれていないようですが, 判別不能な場合の処理として, 古いバージョンではsjisと判断していたところを eucに判断するようにしたのではないでしょうか。 |
|
どうやら,2.3から2.6にバージョンアップしたときに 修正されたようです。以下,引用です。 (バージョンの記述が変だったというのは私の勘違いでした。) −−−−−−−−−−−−−−−−−−−−− jcode.pl-2.6 をリリースしました。 ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/jcode.pl-2.6 2.3 からの変更点は、以下の通り。 - &jcode'tr の中で JIS コードの認識方法をちょっとだけ変更 - JIS X 0208-1990 のシークエンスを認識するように変更 - &jcode'getcode のバグを修正して、説明を追加 --utashiro |
|
はじめまして。玉中と申します。 突然の投稿で失礼致します。 1台のパソコンにネットワークカードが複数枚ささっており、それぞれにIPアドレスが割り当てられている場合に、それら全てのIPアドレスを取得するにはどのようにすればよいのでしょうか。言語は C/C++ です。 NIC が1枚だけの場合は、gethostname() と gethostbyname() で取得できるのですが、複数の場合の取得方法が分かりません。 つまりは、ifconfig コマンドのようなことをやりたいのですが、 どなたか方法をご存知ありませんでしょうか。 よろしくお願い致します。 |
|
UDPクライアントをPerlで作成したいのですが なかなか上手く行きません。 特定のポート番号(例 NTPの123)にメッセージをなげて そのポート番号が存在するかしないかを確かめたいのですが・・・ どなたか詳しい方いらっしゃいませんか? |
|
>>2198 SA > 特定のポート番号(例 NTPの123)にメッセージをなげて 送るだけなら、多分こんな感じだったかと。 use Socket; my $iaddr = inet_aton("10.0.0.1"); my $sock_addr = pack_sockaddr_in(123 ,$iaddr); socket(SOCKET, PF_INET, SOCK_DGRAM, 0); send(SOCKET, "hoge", 0, $sock_addr); ただし、 > そのポート番号が存在するかしないかを確かめたいのですが・・・ UDP なので、送ったデータが相手側に到達したかどうかは 判別できません。 >>2197 玉中 > つまりは、ifconfig コマンドのようなことをやりたいのですが、 ioctl & SIOCGIFCONF でやるか、BSD 系なら getifaddrs(3) ってのが 使えるはずです (OS 名くらい書きましょう)。どちらも http://www.mmjp.or.jp/pearsoned/washo/network/wa_net28-j.html の16章に載ってます。 あとは ifconfig のソースなどを参考にして下さい。 http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/sbin/ifconfig/ |
|
>>2184 68user >> @a[0] はスライスです。 > ん〜、(@a)[0] とは違うということですか? どちらもスライスだと思うのですが @a は配列のスライスで, (@a) はリストのスライスかと… ただし, どちらも一般的には「配列スライス」で括られると思います。 要は, 単数であっても配列やリストの添え字であった場合には スライスと呼べるだろうという個人的解釈です。 # ↑突っ込み大歓迎モード |
|
AGEと申します。 Red Hot Linux 7.0J を使用しています。 「ntp-4.1.0.tar.gz」をインストールしてみました。 しかし、rpm のものがあったのでアンインストールしたいのですが インストールされたファイルを知る方法はあるのでしょうか? よろしくお願いいたします。 |
|
>>2191 68user ServletもCGIと同じくリクエスト毎に起動するのですか? 不勉強でした。セッション管理ができると言うので常駐するものと 勘違いしていました。 >パズルのようにプログラムを組み上げて行く感じです。 そのパズルが難しそう(^^; >>2201 AGE >インストールされたファイルを知る方法はあるのでしょうか? man rpm をどうぞ。 ntpってRHLに標準で入っている(はず)の xntpdとは別物なんですね。 |
|
>>>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回以上の最短マッチ」 ・「行の終わり」または「&の直前」 と,部分的にしか理解できませんでした。 |
|
>>2208 shii おいらはこう書くべきと思うけどな my ($assist_code) = $input =~ /(?:^|&)assist=([^&]*)/; どうせassist=なんじゃら、なんて残ってたって関係ないし。 > 正規表現内のカッコの数が合わない理由を教えてください。 ミスだねこれは だいたい、これだと > ($assist_code) = $input =~ s/(^|&)assist=(.*?))($|&)//; $assist_codeに入るのは(^|&)の部分になっちゃう |
|
>2207 68user >もし Makefile に uninstall とか deinstall とかいうターゲットがあるなら、 > # make uninstall これでうまくいきました。ありがとうございました。 |