重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

やりたいことは日本語文字列の処理で、特定の文字を切り抜きたいのですがうまくいきません。
なぜなら、文字列を切り抜くsubstr関数がバイト単位であるのに対し、文字列を検索するindexがバイト単位でおこなわれていないからです。

例:
文字列"12万3456円"から、円だけを取り除きたいとします。

$str = "12万3456円";
$index = index($str,"円");
$newStr = substr($str, 0, $index);

indexは7を返すが、substrで0から7番目を切り取っても、バイト単位なのでうまくいきません。

文字列の検索をバイト単位で行う方法を教えてください。
おねがいします。

A 回答 (2件)

そもそも何でバージョンをかかない?



Perl5.8.8だと

$str = "12万3456円";
$index = index($str,"円");
$newStr = substr($str, 0, $index);
print $newStr;

だけでもSJISでも期待の動きをする.
#まあ,危ない文字だと動かないだろうから
#各種プラグマの類は書くべきだけど

けど・・そもそも正規表現にしない事情がまるでわからない

最近のPerlだとベースがUTF8だから
日本語がどーのこーのとか二バイトがどーのこーのは
基本的にはない.
    • good
    • 0
この回答へのお礼

すいません。あせって完全に忘れてました。
環境はubuntu8,Perl5.8.8です。
(mysqlはxampp)

実は、いろいろありまして、
あらかじめ$str = "12万3456円";というふうに宣言すればうまくいくのですが、mySQLから文字列のデータをとってきて実行した場合うまくいかない、という状況でして、それで普通にやるのをあきらめてindexとか使ってやろうとしてました。
それでここにこういった質問をしたのですが、

>最近のPerlだとベースがUTF8だから
>日本語がどーのこーのとか二バイトがどーのこーのは
>基本的にはない

とのご指摘をいただいて、もうすこしねばってみるかと思い、今少し奮闘してたのですが、自己解決いたしました。
この質問の回答とは別物ということにはなりますが、
mySQLからとってきた文字列でうまくできない原因は、はっきりとはわかりませんが、その文字列を操作する前に

no utf8;

をいれるとうまくいきました。

ググってこの原因を詳しく調べたいと思います。

いずれにせよ、手がかりを与えてくださったことに深く感謝いたします。

お礼日時:2008/07/04 22:53

perl 5.8.6以上なら



#!/usr/bin/perl

use encoding 'shiftjis';
use Encode qw/encode decode/;

$str = "12万3456円";
$str =~ s/円//g;

print "$str\n";

これで円を取れますけど、こういう意味ではないのでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

#2へのお礼文にもある通り、この質問は私の早まりすぎた質問でした。

お礼日時:2008/07/04 22:55

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