SJis文字列からある文字を検索する方法




SJisコードはEUCコードと違い、2バイト文字の2バイト目の文字コードが通常の1バイト文字と 同じコードが使われている。
その為、SJis2バイト文字の格納されているエリアから strchr()関数を使ってある文字を 検索しようとしても、2バイト文字の2バイト目がリターンされて自分の欲しい文字を見つけて くれない事に遭遇する。
例えば、「汎用シリアル通信シミュレータ完成[00]」という文字列をSJisコードで表すと
94c4 9770 8356 838a 8341 838b 92ca 904d
8356 837e 8385 838c 815b 835e 8aae 905c
5b30 305d
となっており、この文字列に対して strchr()関数で '['(0x5b)を検索させると、'ー'のコード である0x815bの後ろ1バイトがリターンされてしまう。
そこで登場するのが、マルチバイト文字列に対応したstrchr()関数と同じ機能の_mbschr()関数です。
使い方はstrchr()関数と同じで、違うのは引数及びリターンがunsigned char *型である ことぐらいです。
_mbschr()関数以外にも、マルチバイト文字列対応関数は結構そろっているので、覚えておくと便利です。

ちなみにSJisで2バイト文字の1バイト目は0x81-0x9fと0xe0-0xfcです。
ついでにEUCは0x00-0xffとなっています。


サンプル
/*************************************************************************/
/* テーブルの添字取得(テーブル以外ならデータ取得)                        */
/*************************************************************************/
                                    /* [を検索                           */
//ptr = (char *)strchr(moji,(int)'[');
ptr = (char *)_mbschr((unsigned char *)moji,(int)'[');
if( ptr != NULL )                   /* [有り                             */
{
                                    /* [以降の文字列取得                 */
    memcpy( wk,ptr,strlen(ptr) );
                                    /* テーブル添字取得                  */
    sscanf( &wk[1],"%hd",&x );





N総研ソフトウェア開発部のTOPに戻る。

このページに関するご意見・質問は
ドンタコスN村 E-mail:wnaka@coco.ned.co.jp
まで送信してください。