• ベストアンサー

シフトJIS 2バイト字の範囲

シフトJISの2バイト文字の範囲は 0x40~0x7e と 0x80~0xfc と 0x40~0xfc のどっちですか? どちらの情報も見たことがあるんです。 シフトJISの文字をマッチングさせる場合、 ここでは見やすく、スペースを入れて / [\x81-\x9f] [\x40-\xfc] | [\xe0-\xfc] [\x40-\xfc] / とした場合、例えば、亜a という文字列があったら 亜 の2バイト目(下位ニブルっていうのかな)が 9F で b は16進で 62 だから、亜 の2バイト目と a が、 2バイトのシフトJISとしてこれにマッチしてしまうんです。 シフトJISで、こういう例外処理を書かずに、 全てに適用できるシフトJIS2バイトマッチのソースが あれば教えてください。

  • A__
  • お礼率59% (194/328)
  • CGI
  • 回答数2
  • ありがとう数6

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

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

「0x40~0x7e と 0x80~0xfc」だと思いますよ。 「亜a」に対してマッチングするのではなく、前から2バイトずつマッチングして、マッチしたら2バイト進み、マッチしなかったら1バイト進むというようにしないとダメでは? 0x7fの例外処理?を除くことはできないですよね。

参考URL:
http://www.sowa.is.uec.ac.jp/~ueno/material/kanji/sjis.html
A__
質問者

お礼

文字列先頭から見ていく というのは思いつきませんでした。 ありがとうございます。

その他の回答 (1)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

シフトJISの2バイト目のコードは、 0x40~0x7E 及び 0x80~0xFC です。 0x7Fは含みません。 で、2バイトシフトJISにマッチさせるなら、 /([\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])/ と書けばOKなはずです。 […]という文字集合を使用しているのだから、2パターンに分ける必要はないですよ。

A__
質問者

お礼

パターンをパイプを使わずに書く方法は勉強になりました。 ありがとうございます。

関連するQ&A

  • シフトJIS の1バイト目

    シフトJISの1バイト目は 0x81~0x9F と 0xE0~0xEF というサイトもある。 0x81~0x9F と 0xE0~0xFC というサイトもある。 最近、文字コードに追加か削除された文字があるから 意見が2つに分かれていると思うんだけど、 現在はどうなのか教えてください。 シフトJISの2バイト目は 0x40~0x7E と 0x80~0xFC ですか? http://google.yahoo.co.jp/bin/query?p=%a5%b7%a5%d5%a5%c8JIS+9F+E0+81&hc=0&hs=0 を参考にしました。

    • 締切済み
    • CGI
  • シフトJISの2バイト文字

    シフトJISの1バイト目は シフトJISの1バイト目は 0x81~0x9F と 0xE0~0xEF と書いてあるサイトもいくつかあるし、 0x81~0x9F と 0xE0~0xFC と書いてあるサイトもいくつかあります。 どうして意見が2つに分かれているんですか? どっちが正しいのか教えてください。 シフトJISの2バイト目は 0x40~0x7E と 0x80~0xFC ですか?

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

    • ベストアンサー
    • CGI
  • Shift_JIS漢字を削除したい

    Shift_JISファイルの中の漢字を削除したいですが、 以下のスクリプトがうまく行きません(なにも削除してくれない)。 while ( <IN> ) { chomp(); tr/[\x81-\x9F][\x40-\xFC]//; tr/[\xE0-\xEF][\x40-\xFC]//; print OUT "$_\n"; } どう書けばよいでしょうか?

  • シフトJISの仕組みとは?

    JIS X 201の隙間、0x81~0x9Fの31文字分と0xE0~0xEFの16文字分、あわせて47文字分の隙間に94文字ある区をどうやって当てはめてるのか?という質問です。 学校で先生にサラッと蛇足的に説明してもらったのですが、まったく意味不明なのです。 かなり気になっていて、どうか教えてください。 その他、そういう事が乗っているサイトや書籍なども教えていただけると嬉しいです。

  • シフトJISにおけるマッチング

    シフトJIS使用時の日本語のマッチングにおいて 正確なマッチングができないことは分かっているのですが いわゆるダメ文字が含まれていないにもかかわらず マッチングがおかしいことがあります。 ちょう、きゅうなど最後「~う」で終わる言葉のマッチングさせると マッチングするはずがしないのです。 この理由は何が考えられますか? UTF-8に変換してマッチングさせればいいのは分かっているのですが どうしてなのかという理由が知りたいので投稿させていただきました。

    • ベストアンサー
    • Perl
  • 漢字の第1バイト検証

    今、文字判定関数について勉強しているのですが、 unsingned char uch にgetchar()の値を入れ if(uch >= 0x81 && uch <= 0x9f || uch >= 0xe0 && uch <= 0xfc) とうコードで、なぜ漢字コードは「0x81~0x9f」と「0xe0~0xfc」の 二つの範囲があるのか解りません。 よろしくお願いします。

  • シフトJISに悩まされて

    シフトJIS文字列を半角大文字だけを小文字にする関数を作ってみました 何かおかしいところはないでしょうか? #include<iostream> #include<string> using namespace std; string MySmallString(const string arg) { unsigned u; unsigned char uc; string str; for(str=arg,u=0;u<str.size();u++) { uc=str.at(u); if(uc<0x80) { if('A'<=uc && uc<='Z')str.at(u)+='a'-'A'; } else if( (uc<0xa0 || 0xe0<=uc) ) { u++; } } return str; } void main(void)//テスト { string str,str0; cout<<MySmallString("本田ABCDEFGHIJKLMNOPQRSTUVWXYZあいうえおアaイbウcエdオe")<<endl; } 最後のアイウエオは(強制的に全角に変換されてしまっていますが半角です このテストだけは通りましたが何かまずい場合はないでしょうか?

  • 「シフトJIS X 0213」形式の文字コードチェック

    Javaにて「シフトJIS X 0213」で定められている下記の文字を判断したいです。 (参照: http://www.eonet.ne.jp/~kotobukispace/ddt/jisx0213/sjis8xxx.html) ・第3水準 ・第4水準 ・予約 ・使用不可 実現方法としては、文字列を「シフトJIS X 0213」にエンコードして、 エンコードした文字のバイトを判断するのが妥当だと思いますが、 Javaにて「シフトJIS X 0213」にエンコードすることは可能でしょうか。 sunの「サポートされているエンコーディング」の一覧を見ても「シフトJIS X 0213」 はサポートされていないように見受けられます。 (参照: http://www.ingrid.org/java/i18n/encoding/) 仮に「シフトJIS X 0213」にエンコード出来ない場合、 他の方法にて実現する方法等ありましたらご教授願います。 【動作環境】 OS:Windows Vista Business JRE:1.5.0_10

    • ベストアンサー
    • Java
  • JISコードとシフトJISコードの違い

    僕の買った参考書には ASCIIコード・・・英数字・記号を1Bで表す。 JISコード・・・英数字・記号を1Bで表すコード体系とひらがな・漢字を2バイトで表すコード体系。 シフトJISコード・・・ASCIIの1Bコード体系とJISの2Bコード体系を合体した文字コード。 とあるのですが、JISコードとシフトJISコードの違いが分かりません。というか同じではないでしょうか?2つのコードの違いを教えてください。

専門家に質問してみよう