• ベストアンサー

シフト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バイト文字だけを取り出す方法を 教えてもらおうと思いました。

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

  • ベストアンサー
  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.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; } ######################################

A__
質問者

お礼

ありがとうございます。 質問以外の $cnt+=s/.//g; #半角の文字数 っていうのも勉強になりました。 前に教えてもらった =~ ///o の o についてのソースなんでけど、 実際試してみたら全部ヒットしてしまいました。 分かりません。 でも、めったに使うことない o だと思うから 今はあんまり気にしていません。

その他の回答 (1)

  • kazu-kun
  • ベストアンサー率31% (72/232)
回答No.1

シフトJISの1バイト目はASCIIと区別がつくので良いですが、2バイト目はASCIIと区別がつかないので、文字列の先頭から1バイトずつ見ていかないと、どこがSJISの2バイト文字かを判定することはできないよーな気がします。 #2バイト組で見ていけばOKかもしれませんが。

A__
質問者

お礼

ありがとうございます。 substr($line, $strlen-1, 2) というふうに2文字ずつなんですね。

関連するQ&A