• ベストアンサー

文字列検索(例えばindex関数)をバイト単位で行いたい

やりたいことは日本語文字列の処理で、特定の文字を切り抜きたいのですがうまくいきません。 なぜなら、文字列を切り抜くsubstr関数がバイト単位であるのに対し、文字列を検索するindexがバイト単位でおこなわれていないからです。 例: 文字列"12万3456円"から、円だけを取り除きたいとします。 $str = "12万3456円"; $index = index($str,"円"); $newStr = substr($str, 0, $index); indexは7を返すが、substrで0から7番目を切り取っても、バイト単位なのでうまくいきません。 文字列の検索をバイト単位で行う方法を教えてください。 おねがいします。

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

質問者が選んだベストアンサー

  • ベストアンサー
  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.2

そもそも何でバージョンをかかない? Perl5.8.8だと $str = "12万3456円"; $index = index($str,"円"); $newStr = substr($str, 0, $index); print $newStr; だけでもSJISでも期待の動きをする. #まあ,危ない文字だと動かないだろうから #各種プラグマの類は書くべきだけど けど・・そもそも正規表現にしない事情がまるでわからない 最近のPerlだとベースがUTF8だから 日本語がどーのこーのとか二バイトがどーのこーのは 基本的にはない.

tenketu
質問者

お礼

すいません。あせって完全に忘れてました。 環境はubuntu8,Perl5.8.8です。 (mysqlはxampp) 実は、いろいろありまして、 あらかじめ$str = "12万3456円";というふうに宣言すればうまくいくのですが、mySQLから文字列のデータをとってきて実行した場合うまくいかない、という状況でして、それで普通にやるのをあきらめてindexとか使ってやろうとしてました。 それでここにこういった質問をしたのですが、 >最近のPerlだとベースがUTF8だから >日本語がどーのこーのとか二バイトがどーのこーのは >基本的にはない とのご指摘をいただいて、もうすこしねばってみるかと思い、今少し奮闘してたのですが、自己解決いたしました。 この質問の回答とは別物ということにはなりますが、 mySQLからとってきた文字列でうまくできない原因は、はっきりとはわかりませんが、その文字列を操作する前に 「 no utf8; 」 をいれるとうまくいきました。 ググってこの原因を詳しく調べたいと思います。 いずれにせよ、手がかりを与えてくださったことに深く感謝いたします。

その他の回答 (1)

回答No.1

perl 5.8.6以上なら #!/usr/bin/perl use encoding 'shiftjis'; use Encode qw/encode decode/; $str = "12万3456円"; $str =~ s/円//g; print "$str\n"; これで円を取れますけど、こういう意味ではないのでしょうか?

tenketu
質問者

お礼

回答ありがとうございます。 #2へのお礼文にもある通り、この質問は私の早まりすぎた質問でした。

関連するQ&A

  • 文字列の先頭から指定バイトだけ取得

    質問があります。 1バイト文字が来ても2バイト文字が来ても 表示時に視覚的に同じ長さを返す関数が作りたいのですがうまくいきません。 $str1 = "あああaあ"; $str2 ="aaaaaaaaa"; function hoge($str) { return mb_substr($str, 0, 5); } これだと表示した場合に あああaあ aaaaa となってしまいます。 mb_substrをsubstrにすると2バイト文字の途中をsubstrで指定してしまうと文字化けしてしまいます。 何かうまい回避方法はないでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字列検索の関数

    PHP初心者です。 今、文字列$strに使われている文字をチェックして、エラーのときはその文字を表示させたいと思っています。 文字列 $strに特定の文字(B,Z,J,O,X,*)が入っていたらエラーで、エラーになった文字を表示させたいと思っています。このとき、使用する関数はpreg_match_allでいいのでしょうか。 今は、下記のように書いています。 if(preg_match_all("/[B,Z,J,O,X,*]/i",$aaseq[$i],$moji[$i])){     ほかに適当な関数あるでしょうか。

    • ベストアンサー
    • PHP
  • 文字列の検索について

    こんにちわ。文字列の検索について質問があります。 ↓のコードは、 「$str という文字列の中に"<!>" という文字列が含まれていたら、その都度その位置を 知らせる」と意図したものです。 $str の中に "<!>" が3つ含まれていたら、3回それらの位置を知らせるはずです。 しかし、実際は、最後の $iの位置だけ出力されます。 どこに問題があるのでしょうか? よろしくお願いいたします。 -------コード(ココカラ)------- for ($i=1; $i<length; $i++) { $strsub=substr($str, $i, $i+2); if ($strsub == "<!>") { echo $i; echo "\r\n"; } } -------ココマデ-------

    • ベストアンサー
    • PHP
  • 【VB.NET】文字列検索方法

    【VB.NET】文字列検索方法  今晩は,質問させていただきます.どうぞよろしくお願いいたします.  例えば、Str1 = "ABCABCABCABC" におきまして 「4番目の"B"」の位置(この場合11)を知りたい、という場合に すぐにそれが計算できる関数のようなものってあるのでございましょうか?? ↓のようなめんどくさい方法しか思いつかないのでございますが。。。orz  ・Str1.Indexof("B") が2になるのでそこまで消す   →Str2 = "CABCABCABC"  →・上と同様に2回目   →Str3 = "CABCABC"  →・上と同様に3回目   →Str4 = "CABC"  →・最後に一回検索して、今まで消した文字数合計と検索位置を加える →「11」   orz  もし何かもっと早い方法などございましたら、是非ともご紹介 いただきたくどうぞよろしくお願いいたします。

  • 文字列検索で

    よろしくお願いします。 文字列検索instr関数で、特定文字(スペース)でない文字を検索したいのですが、どのようにしたらいいですか? instr関数では、できないのでしょうか? たとえば、 文字列" osietegoo "  →  3 文字列"    situmon"  →  7 スペースでない文字が出現する位置を知りたいです。 instr(文字列,"o")ではなく、" "ではない、、、としたいのですが、できますか?

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

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

    • ベストアンサー
    • Perl
  • Javascriptで文字列操作

    こんにちは。 strの右から2文字を取り出したいのですがうまくいきません。 どこが間違ってますでしょうか? strの文字列の長さはそのときによって違います。 function test(){ str="12345" alert(str = str.substr(-0,2)); }

  • soraris10 ksh で文字列をバイト指定し

    soraris10 ksh で文字列をバイト指定して入れ替える 8バイトの文字列の4バイト目と7バイト目を入れ替えたい場合、簡単にできる方法はありますか? 文字列は半角英字のみです。 echo abcdefgh | awk ’{print substr(ゴニョゴニョ) substr(ゴニョゴニョ)}’ で頑張ってやりましたが、美しくなかったので、sedとかでもっと簡単にできないでしょうか。 宜しくお願いいたします。

  • 文字列取得 substrではできません。

    1バイト2バイト混在文字列を substrで取得すると、2バイト文字が半分になるため最終文字が文字化けします。 1、2バイト混在文字をうまく取得できる関数はありますか?

    • ベストアンサー
    • PHP
  • VB2005の文字列関連の関数について

    VB2005で ある文字列中の特定文字の位置を返す関数はありますか? たとえば "1234567890" という文字列中で"56"という文字列は "5"番めにあるというような。 N88BasicのPOS$のようなイメージです。

専門家に質問してみよう