• ベストアンサー

半角、全角の判別方法

100バイトの領域の半角、全角を含む文字列のから 40バイトを取得したいのですが、最後は文字化けにならないように したいのですが、どうやればいいでしょうか? strncpy(testBefore,testAfter,40); とかやってみましたが案の定文字化けになってしまいました。 半角の文字コードを全て定義しておき、最後がそれになっていないか比較するという方法以外に何か手はありますでしょうか? 文字コードはEUCです。 宜しくお願いします。

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

半角文字は最上位ビットを見ればわかるので定義しなくても判別は出来ます。 問題は40バイト目が全角文字(最上位ビットが1)の場合にそれが1バイト目なのか2バイト目なのか3バイト目(補助漢字は3バイトになるのがEUCの欠点ですね)なのかの判断が出来ないことです。 例えば"aいいいい"という文字列はEUC-JPでは 0x61, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4 になります。 結局、文字列の最初から1バイトずつ順番にチェックしていくしかないのではないでしょうか。

take_july
質問者

お礼

ありがとうございます。 すっきりしました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • tettsu
  • ベストアンサー率30% (4/13)
回答No.1

EUCコードについて調べてみれば分かりますが、 1バイト目が、0xA1 ~ 0xFEの場合は、2バイト文字として扱われるようです。 そして1バイト目が、0x8Eだった場合は、次の文字を半角カタカナとして扱います。 質問によると、40バイト取得したいとのことですが、単純に40バイトで切るのなら40バイト分コピーして、 後ろの文字と、その一つ前を判定すれば良いと思います。 でも、半角40文字分の文字列の取得となると、半角カタカナも2バイトで表現されるため、 1文字ずつ判定しながらコピーしなくてはいけません。 気を付けなければならないのが、文字列判定時にcharではなくてunsigned charを使うということです。 これについては、コンピュータ内の負の数の表現方法を勉強すれば分かると思います。

参考URL:
http://www.unixuser.org/~euske/doc/kanjicode/index.html
take_july
質問者

お礼

ありがとうございます。

すると、全ての回答が全文表示されます。

専門家に質問してみよう