• 締切済み

投稿した文字がカタカナかどうかを調べる方法

投稿フォームにフリガナ欄を付けたのですが、 フリガナがカタカナかどうかを調べる箇所でつまづいています。 「ポケットリファレンス」を見よう見まねで下のように作ってみたのですが、 配列furiganaの各要素に一文字ずつ入ってくれません。 (文字列を数字に変換したものがひとつの要素に代入されてしまう) ループを使えば解決してしまうのですが、 「ポケットリファレンス」によると各文字ごとに各要素に入ってくれるようなので 納得がいきません。 いまいちunpackの使い方が分からないので、アドバイスありましたらよろしくお願いいたします。 #フリガナ欄の文字列を16進数に変換して配列に入れる。 @furigana = unpack("H*", $QUERY{furigana}); foreach (@furigana){ #シフトJISの0x8346より前もしくは0x8396より後なら if(($_ < 8340) || (8396 < $_)){ #フラグを上げる。 $flag = 1; } }

  • Perl
  • 回答数2
  • ありがとう数3

みんなの回答

回答No.2

以下を参考にしてはどうでしょうか。 #------------------------------------------------------------------------------# # 概要 ひらがな入力チェック処理 # 入力 $my_cf_val 入力値 # $my_val_len レングスチェック値 -1:未チェック # 戻り値 0:正常 # -1:入力桁数異常 # -2:ひらがな以外あり #------------------------------------------------------------------------------# sub hiragana_chk { my ($my_cf_val,$my_val_len) = @_; my @my_cf_kana = ('ぁ','あ','ぃ','い','ぅ','う','ぇ','え','ぉ','お', 'か','が','き','ぎ','く','ぐ','け','げ','こ','ご', 'さ','ざ','し','じ','す','ず','せ','ぜ','そ','ぞ', 'た','だ','ち','ぢ','っ','つ','づ','て','で','と','ど', 'な','に','ぬ','ね','の', 'は','ば','ぱ','ひ','び','ぴ','ふ','ぶ','ぷ', 'へ','べ','ぺ','ほ','ぼ','ぽ', 'ま','み','む','め','も', 'ゃ','や','ゅ','ゆ','ょ','よ', 'ら','り','る','れ','ろ', 'ゎ','わ','ゐ','ゑ','を','ん', 'は','か','け','ー'); my $my_cf_work; my $my_cf_len; my $my_cf_i; my $my_cf_j; my $my_cf_chk_flg = 0; my $my_cf_hiranum = 87; $my_cf_len = length($my_cf_val); if($my_cf_len == 0) { return(-1); } if($my_val_len != -1) { if($my_cf_len != $my_val_len) { return(-1); } } if(($my_cf_len % 2) != 0) { return(-1); } for($my_cf_i = 0 ; $my_cf_i < $my_cf_len ; $my_cf_i += 2) { $my_cf_chk_flg = 0; $my_cf_work = ''; $my_cf_work = substr($my_cf_val,$my_cf_i,2); for($my_cf_j = 0 ; $my_cf_j < $my_cf_hiranum ; $my_cf_j++) { if($my_cf_work eq $my_cf_kana[$my_cf_j]) { $my_cf_chk_flg = 1; } } if($my_cf_chk_flg == 0) { return(-2); } } return(0); }

  • inoue64
  • ベストアンサー率29% (334/1115)
回答No.1

とほほのWWW入門の中の unpack の解説のページです。

参考URL:
http://tohoho.wakusei.ne.jp/wwwperl2.htm#unpack

関連するQ&A

  • static変数の配列の初期値を空文字列にする一般的な方法

    いつもお世話になっております。 static変数の配列の初期値を空文字列(各要素が'\0')にしたいです。 static変数なので放って置いても各要素に'\0'が入りますが、 初期値として空文字列にしている事を明記したいです。 そこで以下の様な方法を考えてみました。 (1)初期値に何もせず、コメントを書いておく (2)初回起動フラグを持ち、フラグが立っていれば空文字列にする (3)初期値にnull文字をSTR_LENの数だけ書く (4)初期値の先頭のみnull文字にし、残りは省略する どの様な方法が一般的でしょうか? 上記以外にもあれば、教えていただければ幸いです。 また、以下は私が考えたそれぞれの方法のソースです。 -------------------------------------------------------------------------------- #include <stdio.h> #include <string.h> #define STR_LEN 16 #define FLAG_ON (1) #define FLAG_OFF (0) -------------------------------------------------------------------------------- /* 初期値に何もせず、コメントを書いておく */ -------------------------------------------------------------------------------- void clear_1(void) { static char hoge[STR_LEN]; /* 空文字列 */ } -------------------------------------------------------------------------------- /* 初回起動フラグを持ち、フラグが立っていれば空文字列にする */ -------------------------------------------------------------------------------- void clear_2(void) { static char hoge[STR_LEN]; static int first = FLAG_ON; if(first == FLAG_ON){ strncpy(hoge, "\0", STR_LEN); first = FLAG_OFF; } } -------------------------------------------------------------------------------- /* 初期値にnull文字をSTR_LENの数だけ書く */ -------------------------------------------------------------------------------- void clear_3(void) { static char hoge[] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}; } -------------------------------------------------------------------------------- /* 初期値の先頭のみnull文字にし、残りは省略する */ -------------------------------------------------------------------------------- void clear_4(void) { static char str[STR_LEN] = {'\0', }; } --------------------------------------------------------------------------------

  • 文字列の取得について

    配列には下記のような文字列が表示されています。 $array[$i]="text kldfjk kldof" このような長い文字列の場合にそこの ”text"とという文字列が表示されている場合には フラグを立てるというプログラムにしたいのですが、 このような処理ではうまくいきません。 何かよい解決策があれば教えていただけたらうれしいです。よろしくお願いいたします。 $single_1=strpos($array[$i],"text"); $flag=1;

    • ベストアンサー
    • PHP
  • 実数→文字列の方法

    文字列を実数に変換するのに関数atofを使いますが、それとは逆に、 プログラム内で算出された実数を文字列にどう変換したらよいのでしょうか? 算出された実数を配列Xに納め、それをfopenで書き込み用として開いてるファイル(ポインタ名はfp)に fputs(x,fp) としたら error: cannot convert `double*' to `const char*' for argument `1' to `int fputs(const char*, FILE*)' と表示されてしまいました。実数を文字列に変換してからでないとダメかと思っています。

  • 文字列の操作

    こんにちは。 以下のような、文字列があるとします。 NUMBER1(ヌル\0)からNUMBER1000(ヌル\0)までの文字列があるとします。 NUMBERは付属で、ほしい文字列が1から1000までNUMBERの次にある場合、1から1000までを取得する方法として、 Buf[100] int x=0; while(Buf[x]!='\0') //ナル文字までの長さを取得 x++; memmove(&Buf[0],Buf[x-1],4); //NUMBER1の場合、長さは7。しかしほしい文字列は第6要素なのでx-1。 しかし・・・これを行うと、 NUMBER10:長さ8 NUMBER100:長さ9 ・ ・ となり、二桁以上の場合は、memmove(&Buf[0],Buf[x-2],4)と、 第2引数を手動で可変しなければなりません。 そこで、NUMBER\01\0 NUMBER\01000\0というように、 NUMBERの次にヌル文字(あってますでしょうか?)\0を挿入し、次の要素に1から1000まで文字列を挿入。そして文字列終端が分かるように再度\0を挿入します。 しかしこのような場合、ヌルを2つ挿入することで、上記に示したプログラムでは、手前の\0までしか長さを取得しないので、うまくいきません。 そこで、文字列の区切りを示すための方法として、なにかありますでしょうか? 文字列は最後に、\0を挿入することで判別すると書いてありますが、 NUMBERVISUALC++\0というような文字列を配列に格納してある場合、 NUMBERとVISUALC++をどのように分けて取得するのでしょうか? それとも、第6要素から取得した文字列があると言う事が分かっている場合、第6要素からを指定するプログラムを作るということになるのでしょうか? よろしくお願いします。

  • 複数配列で重複する文字列を削除する方法

    PHPで複数配列で重複する文字列が含まれている場合の処理の仕方について $a[0] = "あああいいいうううかかかききき"; $a[1] = "あああいいいうううかかかくくく"; $a[2] = "あああいいいうううかかかけけけ"; $a[3] = "あああいいいうううきききききき"; 上記のような配列があったとします(配列の要素数については可変です) 上記配列の中で共通する文字列を削除し(文字列の先頭のほうを削除) $a[0] = "かかかききき"; $a[1] = "かかかくくく"; $a[2] = "かかかけけけ"; $a[3] = "きききききき"; のようにしたいのですが処理方法が思い浮かびません。 文字列を分解して比較する処理まではできるのですが、要素数が3つになったり7つになったりした場合の方法が思い浮かびません。 どなたか 分かる方よろしくお願いします。

    • ベストアンサー
    • PHP
  • TCL言語で文字列検索方法を教えてください。

    こんにちは TCL初学者です。 romは複数出てくる場合あり。 ある配列に ******rom****** という文字列があります *:は任意の数字や文字や記号です。 romという並びを見つけたらFLAG=1 romという並びが無ければFLAG=0 のような関数を作るのはどうしたらよいでしょうか? C言語やPASCALなら読めます。 ただTCLで記述した事が無いので、想像が出来ません よろしくお願いします。

  • VB6で配列を文字列に変換する方法?

    VisualBasic6を使っております。 Dim ary() As Byte Dim s as String 配列を文字列に変換したり、文字列を配列にしたいのですが どのようにすれば良いのでしょうか?

  • 16進n桁の文字列変換の方法は?

    手持ちの本『JavaScriptポケットリファレンス』によると『toString(16)』で 整数値を16進数の文字列へ変換できるようです。 そこで質問します。 整数値『123』を16進数の4桁『007B』に変換する方法を教えて下さい。 『Number(123).toString(16).toUpperCase()』とすると『7B』ですので、 先頭に『00』を追加したいのです。どうすれば良いでしょうか? あと、10進n桁の方法も同じように出来ると思いますが、その方法も一緒に教えて下さい。 以上。お願いします。→JavaScript 歴1.5ヵ月です。

  • 配列の要素数を調べる方法

    配列の中にいくつ要素があるか後から調べる方法はあるでしょうか? int test[4][3] = {   {0,1,2},   {0,1,2},   {0,1,2},   {0,1,2}, } ; 上のケースだと、X方向に3、Y方向に4つの 要素があります。しかし、これだとあらかじめいくつ要素があるかを決めて 置かないといけません。 例えば、 int test[] = {0,1,2,3....} みたいに宣言された場合や、 char *test[] = {   "ああああああ",   "いいいいいい",   "うううううう",      ・      ・ //(これは文字列の数を要素数とします) } ; のように宣言された二次元配列などで、後から配列内にいくつ要素があるかを 調べることなどは可能でしょうか?

  • イメージデータを文字列に変換する関数は?

    初心者です。 質問させてください。 イメージを編集してそれをmysqlのデータベースに渡したいのですが、イメージを文字列に変換する関数はありますでしょうか? 最終的に $imghexdata = unpack("H*hex", $editimgstr); のようにして16進数の文字列にしてmysqlに渡したいのです。 編集の内容は例えば以下のような内容です。 $haikei = imagecreatefromjpeg( "haikei.jpg" ); $insimg = imagecreatefromjpeg( "insert.jpg" ); imagecopymerge($haikei, $insimg, 0, 0, 0, 0, imagesx($insimg), imagesy($insimg), 50); この$haikeiを文字列に変換したいのです。 ひょっとしてunpackで出来るのでしょうか? どうぞよろしくお願いいします。

    • 締切済み
    • PHP

専門家に質問してみよう