- ベストアンサー
シフトJISの2バイト文字を知る
シフトJISの2バイト文字を0に置き換えたいと思いました。 $sjifstr =~ tr/\x??-\x??/'0'/; という部分の?が分かればこれは成功しますか? これは2バイト文字を知るための勉強として 試していることです。 2バイト文字のことが分かるようになったら、 フォームから入力された文字列が7文字以上だった場合、 6文字目を…にして、日本語1文字を2文字として計算して 必ず6文字以内になるようにしたいと思っています。 abあいc → abあ… あaいう → あい… a亜bcい → a亜b… のようにしたいと思っています。 それで、まず2バイト文字だけを取り出す方法を 教えてもらおうと思いました。
- みんなの回答 (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; } ######################################
その他の回答 (1)
- kazu-kun
- ベストアンサー率31% (72/232)
シフトJISの1バイト目はASCIIと区別がつくので良いですが、2バイト目はASCIIと区別がつかないので、文字列の先頭から1バイトずつ見ていかないと、どこがSJISの2バイト文字かを判定することはできないよーな気がします。 #2バイト組で見ていけばOKかもしれませんが。
お礼
ありがとうございます。 substr($line, $strlen-1, 2) というふうに2文字ずつなんですね。
お礼
ありがとうございます。 質問以外の $cnt+=s/.//g; #半角の文字数 っていうのも勉強になりました。 前に教えてもらった =~ ///o の o についてのソースなんでけど、 実際試してみたら全部ヒットしてしまいました。 分かりません。 でも、めったに使うことない o だと思うから 今はあんまり気にしていません。