全角文字と半角文字の複合文の処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
やっくん

全角文字と半角文字の複合文の処理

#1

投稿記事 by やっくん » 15年前

現在、DXライブラリを使用してRPGで使用する会話システムを作っています。
大まかな仕様は
・与えられた任意の文字列を任意の速度で1文字ずつ表示する。
・リターンキーを押すと枠いっぱいになるまで文字を1文字ずつ速度MAXで表示していく。
・文字列を全て表示してしまったらリターンキーの入力待ち。
というものです。

1文字ずつ表示するということでとりあえず文字は全角文字だけに的を絞って作りました。
全角だけならば↑の条件を満たし、動きました。
しかし、半角と全角文字が混じっていても対応できるようにしたいのですが躓いてしまったので質問させていただきます。

まず以下に変更したい場所のプログラムソースを一部載せます。
/*
talkContents[/url] -> 与えられた会話文字列
talkStr[/url][/url]    -> 1行ずつ表示するために分解した文字列
i              -> 行No
j              -> 文字の要素No(現在は全角対象なので2つのNoで1文字)
pointer        -> 与えられた文字列の抜き出す文字を指し示す
*/
talkStr[j  ] = talkContents[pointer  ]; // 与えられた全角文字列を、
talkStr[j+1] = talkContents[pointer+1]; // 全角1文字ずつコピーして
talkStr[j+2] = '\0'; // そこまでを文字列とする
if(strcmp(&talkStr[j],"。") == 0){ // "。"を読み込んだら次の行へ
    i++;
    j=0;
}
else j+=2;
pointer+=2;


↑のソースでは全角しか対応できません。
質問内容:半角にも対応するためにはどうすれば良いでしょうか?

最初考えた物としてコピーしようとする文字の上位バイト(ここではtalkContents[pointe[/url])を調べ、半角文字の場合の処理を作ってしまえば良いと思い、シフトJIS(http://charset.7jp.net/sjis.html)より

if(talkContents[pointe[/url] >= 0x00 && talkContents[pointe[/url] < 0x7e){
/* 処理 */
}

という処理を以下の二つの命令の間に追記しましたが、結果は上手くいきませんでした。
/**********************************************
talkStr[j ] = talkContents[pointer ];
// ここに追記し、以下を場合分けして対応させた。
talkStr[j+1] = talkContents[pointer+1];
**********************************************/

へろりくしょん

Re:全角文字と半角文字の複合文の処理

#2

投稿記事 by へろりくしょん » 15年前

DXライブラリとかはさっぱり解りませんが

いっそUnicodeでも使ったらどうですか?

ドラ

Re:全角文字と半角文字の複合文の処理

#3

投稿記事 by ドラ » 15年前

こんな感じでしょうか?
赤字のところがポイントです。

#include <stdio.h>
#include <string.h>

int main(void)
{
char talkContents[128] = "ハロー Shift_JIS の世界!!。これでOK?。";
char talkStr[4][128] = {'\0'};
int pointer, i = 0, j = 0;

for (pointer = 0; talkContents[pointe[/url] != '\0'; )
{
unsigned char ch = talkContents[pointer++];
if ( (ch >= 0x81 && ch <= 0x9f) || (ch >= 0xe0 && ch <= 0xef) ) // 全角文字の1バイト目だったら
{
talkStr[j] = ch; // 全角文字の1バイト目をコピー
talkStr[j+1] = talkContents[pointer++]; // 全角文字の2バイト目もコピー
talkStr[j+2] = '\0';
if(strcmp(&talkStr[j],"。") == 0){ // "。"を読み込んだら次の行へ
i++;
j=0;
}
else j+=2;
}
else // 半角文字だったら
{
talkStr[j++] = ch; // 半角文字をコピー
}
}
talkStr[j] = '\0';

printf("talkContents : \"%s\"\n", talkContents);
for (i = 0; i < 4; i++)
{
printf(" talkStr[%d] : \"%s\"\n", i, talkStr);
}

return 0;
}

もっと高速な判定方法も存在するようなので、そちらを使った方がいいかもしれません。
http://www.st.rim.or.jp/~phinloda/cqa/cqa15.html#Q4

やっくん

Re:全角文字と半角文字の複合文の処理

#4

投稿記事 by やっくん » 15年前

>へろりさん
助言ありがとうございますm(__)m
しかし、今回はシフトJISコードのままで解決しましたのでシフトJISで行こうと思います。

>ドラさん
わざわざソースコードと参考サイトまで示していただきありがとうございます。
おかげさまで解決しました(^^
参考サイトのマクロ定義はとても自分には高度な内容でしたが、利用することができたのでこちらを使わせていただきます。

閉鎖

“C言語何でも質問掲示板” へ戻る