プロが教えるわが家の防犯対策術!

100バイトの領域の半角、全角を含む文字列のから
40バイトを取得したいのですが、最後は文字化けにならないように
したいのですが、どうやればいいでしょうか?

strncpy(testBefore,testAfter,40);
とかやってみましたが案の定文字化けになってしまいました。

半角の文字コードを全て定義しておき、最後がそれになっていないか比較するという方法以外に何か手はありますでしょうか?

文字コードはEUCです。
宜しくお願いします。

A 回答 (2件)

半角文字は最上位ビットを見ればわかるので定義しなくても判別は出来ます。


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

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

お礼日時:2006/12/01 10:20

EUCコードについて調べてみれば分かりますが、


1バイト目が、0xA1 ~ 0xFEの場合は、2バイト文字として扱われるようです。
そして1バイト目が、0x8Eだった場合は、次の文字を半角カタカナとして扱います。
質問によると、40バイト取得したいとのことですが、単純に40バイトで切るのなら40バイト分コピーして、
後ろの文字と、その一つ前を判定すれば良いと思います。
でも、半角40文字分の文字列の取得となると、半角カタカナも2バイトで表現されるため、
1文字ずつ判定しながらコピーしなくてはいけません。

気を付けなければならないのが、文字列判定時にcharではなくてunsigned charを使うということです。
これについては、コンピュータ内の負の数の表現方法を勉強すれば分かると思います。

参考URL:http://www.unixuser.org/~euske/doc/kanjicode/ind …
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2006/12/01 10:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!