postで送られてくる文字列が日本語(全角)か含まれてくるかどうかか調べたい場合のスクリプトは作れないでしょうか。

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

A 回答 (2件)

Perl以外の言語で(Perl互換の正規表現で)、「日本語がふくまれていないもの」をやったときは、


tr/[\xa1-\xfe]/[\xa1-\xfe]/
がtrueかfalseか、で判断したことがあったように思います。
    • good
    • 0

Perlでそういったモジュールがあるかどうか分かりませんが…。


jcode.plを使ってShitJISに変換、ShiftJISなら漢字=2バイト確定ですから、比較的検索しやすいと思います。
1バイト目が特定範囲のコードなら2バイト目がこの範囲なら漢字(というか全角文字)という判定が出来ると思います。
今、手元に漢字コード表がないので正確にこの範囲の文字コードなら…と書けません。

中途半端な回答で申し訳ありません。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

Q全角空白での文字列分割について

教えてください。
以下のような文字列で、全角空白をキーに2つに分割したいと考えています。

テストテキスト テストテストテスト

スクリプトの文字コードはshiftJISで、分割対象の文字列もshiftJISです。
use encoding "shiftjis";  としてます。

($t1,$t2) = split(/ /, $t);

として試してみましたが、やはり無理でした。

何か良い方法がありましたら、教えてください。
よろしくお願いします。

Aベストアンサー

#1>open ( IN, '<:encoding(shiftjis)', "target_text.txt") ;
を使ってやってもOKでした。
逆に、'<:encoding(shiftjis)' を省略すると、仰るような結果になるので、
use encoding "shiftjis";
が、うまく機能していないのかなと思います。
use encoding "Shift_jis";
use encoding "cp932";
use encoding "UTF-8";
などを試してみたらどうなりますか?

どうも、スクリプトの実際の文字コードがシフトJISではないのではないかと思います。例えばUTF-8とか
(読み込むファイルの方は仰るように変換時に指定コードと違う場合はエラーメッセージがでますので、でないということは、シフトJISで間違いないと思います)

Q@がすでに含まれちゃってる文字列の操作

perlで文字列中に@を使いたいときは
¥などでエスケープすればよいと思いますが、
(パラメタで受け取った)すでに@が入っている文字列の
@までの文字列を切り取るにはどうすればよいでしょう。
どうぞ教えてください。よろしくお願いいたします。

たとえば、
$str1="aaa@bbb";
$str2=substr($str1,0,3);
とやってもエラーになってしまいます。

Aベストアンサー

 @に気を使わなければいけないのは、ソースコード内の文字列だけです。
 引数などから受け取った@は正しく処理されます。

 サンプルがうまくいかないのは、ご自分でおっしゃっているとおりの理由によるものです。

 なお、文字列を "" ではなく '' (CTRL+7)で囲むと、変数が展開されなくなるのでエラーが出なくなります。
 

Q全角文字列から英数字のみ抜き出す方法は?

Perl 文字コード sjis

以下のように、全角文字列の中から、全角英数字のみを抜き出したいのですが、良い方法はありますでしょうか。

あア亜ABC-123

ABC-123

宜しくお願い致します。

Aベストアンサー

いったんUTF-8に変換して、s///g置換で英文字以外を削除する方法が一番楽だと思います。
日本語処理するときは、いったんUTF-8に変換すると便利な場合が多々あります。

UTF-8の扱いについては、参考URLをどうぞ。

--------------------------------------------------
use Encode;

# 検索対象の文字列をUTF-8に変換
my $str = 'あア亜ABC-123';
my $utf_str = Encode::decode('shift-jis', $str);

# 置換に使う条件文字列をUTF-8に変換
$trstr = '0-9A-Za-z-'; # ここは自由に変更してください
my $utf_trstr = Encode::decode('shift-jis', $trstr);

# UTF-8同士ならそのまま置換できる。
# $utf_trstrの中身以外の文字を削除
$utf_str =~ s/[^$utf_trstr]//g;

# 出力するときにshift-jisに戻す
print Encode::encode('shift-jis',$utf_str);

参考URL:http://www.pure.ne.jp/~learner/program/Perl_unicode.html

いったんUTF-8に変換して、s///g置換で英文字以外を削除する方法が一番楽だと思います。
日本語処理するときは、いったんUTF-8に変換すると便利な場合が多々あります。

UTF-8の扱いについては、参考URLをどうぞ。

--------------------------------------------------
use Encode;

# 検索対象の文字列をUTF-8に変換
my $str = 'あア亜ABC-123';
my $utf_str = Encode::decode('shift-jis', $str);

# 置換に使う条件文字列をUTF-8に変換
$trstr = '0-9A-Za-z-'; # ここは自由に変更...続きを読む

Q&(半角アンド)が含まれる文字列の分割

http://oshiete1.goo.ne.jp/kotaeru.php3?q=644082
質問したものです。

&が%26なのはわかったのですが、それを分割する術がわかりません。
ただ普通にsplitでやってしまうと意図しない&で切れてしまいます。
どのようにしたらいいですか?

Aベストアンサー

URLデコード前に&を使って分けましょう。
そして連想配列(ハッシュ)に突っ込みましょう。
で、煮るなり焼くなりした方がいいです。(というかそれが普通です)
見たところ、遠回りなことやってますよ。

read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
foreach $pair (split(/&/,$buffer)){
($name,$value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}

それと、配列なのに
> @filew = "$TITLETITLE=$TITLE&$DATETITLE=$DATE&……\n";
とやっている意味が不明です。
これなら普通に変数に代入するべき。
で、使いまわさないなら
print FH "$TITLETITLE=$TITLE&$DATETITLE=$DATE&……\n";
とやった方がメモリを無駄に消費せずに済みます。

最後に、日本語が混ざったりするならjcode.plなりJcode.pmに通した方が身のためですよ。(ぉ)

URLデコード前に&を使って分けましょう。
そして連想配列(ハッシュ)に突っ込みましょう。
で、煮るなり焼くなりした方がいいです。(というかそれが普通です)
見たところ、遠回りなことやってますよ。

read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
foreach $pair (split(/&/,$buffer)){
($name,$value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}

それと、配列なのに
> @filew = "$TITLETITLE=$TITLE&...続きを読む

Q特定の文字列が含まれているかどうか確認したい

文字列 $a に、文字列 $b が含まれているかどう確認したいと思っています。

$a = "abcdefg"; $b = "cde" なら「真」としたいです。
(要するに、シェルの case や fgrep に似たことをしたい)

ただし、文字列には記号が含まれている可能性もあるため、
正規表現も使いづらい(?)です。

具体的にやりたいことは、$a にはコンマ区切りのメールアドレスのリストが入っていて、
$b のメールアドレスが $a のリストに含まれていない場合のみ、$b を $a似追加すると
いうことがやりたいです。

何か良い方法はないでしょうか?
よろしくお願いいたします。

Aベストアンサー

表示がくずれるので空白2文字を全角空白で書いていることに注意

use strict;
use warnings;
use feature 'say';

my $text = 'hello :-)';
my $word = ':-)';

if ( $text =~ m/\Q$word\E/ ) {
  say 'matched';  # matched
}

my $quoted = quotemeta $word;
say $quoted; # \:\-\)
if ( $text =~ m/$quoted/ ) {
  say 'matched';  # matched
}


おすすめ情報