シフトJISの2バイト文字を0に置き換えたいと思いました。

$sjifstr =~ tr/\x??-\x??/'0'/;

という部分の?が分かればこれは成功しますか?

これは2バイト文字を知るための勉強として
試していることです。
2バイト文字のことが分かるようになったら、
フォームから入力された文字列が7文字以上だった場合、
6文字目を…にして、日本語1文字を2文字として計算して
必ず6文字以内になるようにしたいと思っています。

abあいc → abあ…
あaいう → あい…
a亜bcい → a亜b…

のようにしたいと思っています。
それで、まず2バイト文字だけを取り出す方法を
教えてもらおうと思いました。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

サンプル作ったげるから、あとは自分で研究してちょうだいな。



プログラム1
######################################

$strlen=10;
$line=<STDIN>;
chomp $line;
if (length $line>10) {
if (substr($line, $strlen-1, 2) =~ /([\x81-\x9f][\x40-\xfc])|([\xe0-\xfc][\x40-\xfc])$/) {
$line=substr($line, 0, $strlen-1);
} else {
$line=substr($line, 0, $strlen);
}
print $line."…";
} else {
print $line;
}

######################################


プログラム2
######################################
while(<>) {
$cnt =s/([\x81-\x9f][\x40-\xfc])|([\xe0-\xfc][\x40-\xfc])//g; # shift-jisの文字数
$cnt+=s/.//g; #半角の文字数
print $cnt;
}
######################################
    • good
    • 0
この回答へのお礼

ありがとうございます。
質問以外の
$cnt+=s/.//g; #半角の文字数
っていうのも勉強になりました。

前に教えてもらった
=~ ///o の o についてのソースなんでけど、
実際試してみたら全部ヒットしてしまいました。
分かりません。
でも、めったに使うことない o だと思うから
今はあんまり気にしていません。

お礼日時:2001/10/14 08:10

シフトJISの1バイト目はASCIIと区別がつくので良いですが、2バイト目はASCIIと区別がつかないので、文字列の先頭から1バイトずつ見ていかないと、どこがSJISの2バイト文字かを判定することはできないよーな気がします。


#2バイト組で見ていけばOKかもしれませんが。
    • good
    • 0
この回答へのお礼

ありがとうございます。
substr($line, $strlen-1, 2)
というふうに2文字ずつなんですね。

お礼日時:2001/10/14 08:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QQUERY_STRINGSで'#'文字を受け取るには

次から次へと質問ばかりでスミマセン・・・

GETメソッド前提で、QUERY_STRINGでデータを受けるようなCGIを作っています。

ところが、普通の文字の受け渡しは何の問題も無いのに、途中に'#'が入ると、
そこから後ろが消えてしまっています。

'#'も含めて、全部受け取る方法って無いでしょうか・・?
よろしくお願いします。m--m

Aベストアンサー

# という文字は、ページ内リンクの位置を示すために使われています。これはブラウザがページを表示する時に使うだけのものなので、サーバーには送信されません。

ですので、# という文字をサーバーに送りたかったら、他の記号などと同じくエスケープしなければなりません。# の文字コードは 0x23 ですから、# の代わりに %23 と書いて下さい。

Qperlで、[ \r\n , \n ]の意味は?

シンプルなCGI掲示板の勉強中ですが、

$message =~s/[ \r\n , \n ]/<br \/>/g; となっており、
これは改行文字を<br />に置き換えるのだそうですが、
[ \r\n , \n ]の部分というのはどういった意味でしょうか。

[ abc ]だと、a,b,cのうちどれか1文字は入っていれば良いですよね。
[ ]に「,」が入るとよく分からなくなります。

お分かりの方、教えてくださいませんか。
よろしくお願いいたします。

Aベストアンサー

サンプルは、
$message =~ s/\r\n/<br \/>/g;

$message =~ s/\n/<br \/>/g;
1行で済ませようとして間違ってしまったのでしょうか?

\r 復帰文字(return)

\n 改行(newline)

「,」カンマそのもの

\r 復帰文字 (return)
のいずれかを<br />に置き換える、という意味になってしまうでしょうね。
この目的のためには、

$message =~ s/\r\n/<br \/>/g;
$message =~ s/\r/<br \/>/g;
$message =~ s/\n/<br \/>/g;

と3行記述するのがいいのではないでしょうか?

参考サイトに私が勉強させてもらっているサイトを紹介しておきます。

参考URL:http://www.rfs.jp/sitebuilder/perl/04/07.html

Q\t\t の意味

print "\t\t<TR>\n"; の
\t\t の意味はなんですか、
宜しくお願いします。

Aベストアンサー

\tは「TAB」の意味で、通常は半角で8文字のスペースが表示されます。
ですから、\t\tでTAB2個分の空白があくことになります。

Q#!/usr/local/bin/perlとしたい

WindowsXP上でCGIを動作させる環境を構築しています。
しかし、サーバにアップロードする際にいちいちPerlパスを変更するのが
面倒なので、「#!/usr/local/bin/perl」と、基本的なディレクトリ指定にしたいです。
(サーバそうでなければ結局指定し直しですが)
現在、「#!c:/perl/bin/Perl」で動かしています。

どうすれば出来るでしょうか?ご教示願います。
ちなみにApacheは2.0.55です。

Aベストアンサー

c:/usr/local/bin/perl.exe
となるようにしてください。

Q第1のPC(192.168.0.1)の/var/www/html/に

index.htmlとindex.phpを配置し
第1のPC(192.168.0.2)のアパッチを起動し
第2のPCの起動しているブラウザのアドレス欄に
「http://192.168.0.1:80」
を入力してリターンキーを押すと
第2のPCのブラウザ上にindex.phpが表示されindex.htmlが表示されません
第2のPCの起動しているブラウザのアドレス欄に
「http://192.168.0.1:80/index.html」
を入力してリターンキーを押した場合には第2のPCのブラウザ上にindex.htmlが表示されます

第2のPCのブラウザにデフォルトでindex.htmlを表示するようにするにはどうしたらいいのでしょうか?

Aベストアンサー

httpd.confのDirectoryIndexを
書き換えればよいかと。

ちなみに複数ファイル指定可能。
DirectoryIndex index.html index.php
とすれば、index.htmlがあればindex.html、
なければ、index.phpにアクセスします。

あと、質問するときはApacheのバージョンも
明記してね。
Apache1.*系と2.*系では動きが違うところも
あるからね。
DirectoryIndexは共通のはずだけど。


このカテゴリの人気Q&Aランキング

おすすめ情報