ページ 11

日本語の扱いについて

Posted: 2009年6月24日(水) 00:35
by 東 康生
char *p1 = "My Name Is 東 康生です。";
と初期化して、
EE EEEE EE J JJJJJ
と出力したいです。

やりたいことは、英語と日本語の識別です。
文字列操作をするときに1バイト文字と2バイト文字が複合されていると非常に使いづらいですので、どうにかやる方法はないでしょうか?

Re:日本語の扱いについて

Posted: 2009年6月24日(水) 02:44
by たか
ユニコードとして処理すると楽じゃないでしょうか?
一文字を2byteで扱うので、英語も日本語も関係なく扱えます。
#include <stdio.h>
#include <string.h>

void trans(wchar_t *s)
{
	int len;
	int i;

	len = wcslen(s);
	for( i=0; i < len; i++ )
	{
		if(s >= L'A' && s <= L'z')
			s = L'E';
		else if(s == L' ')
			s = L' ';
		else
			s = L'J';
	}
}

int main(int argc, char **argv)
{
	/* 'L'をつけることで UNICODE になります。 */
	wchar_t wstr[/url] = L"My name is 東 康生です。";

	trans(wstr);
	wprintf(wstr);

	return 0;
}

MinGW + gcc3.4 で動作を確認しました。
上記の文では動きますが、記号や数字が入ると誤認識します。
改良してみてください。

Re:日本語の扱いについて

Posted: 2009年6月24日(水) 09:46
by non
2バイト文字がShift_JISなら、Shift_JISの1バイト目は0x81以上ですので
区別できます。
#include <stdio.h>
#include <string.h>

void trans(char *s1,char *s2)
{
	while(*s1!='\0'){
		if(*s1==' ')
			*s2++=*s1;
		else if((unsigned char)*s1>0x80){
			*s2++='J';s1++;
		}
		else
			*s2++='E';
		s1++;
	}
	*s2='\0';

}					

int main(void)
{
	char *p1 = "My name is 東 康生です。";
	char str2[256]; 
	trans(p1,str2);
	printf(str2);
	return 0;
}

Re:日本語の扱いについて

Posted: 2009年6月24日(水) 10:00
by Blue
半角カナは「J」?
全角英字は「E」?
全角空白は「 」?
記号は?

もう少し明確にできませんかね?
文字コードも、環境に依存しますし。

Re:日本語の扱いについて

Posted: 2009年6月24日(水) 20:59
by 東 康生
> たかさん
ありがとうございます。
wchar_t型にしてしまうと、strcpyやstrcmp関数が使えなくなったり不便なので出来る限り使いたくありませんでした。

> nonさん
ありがとうございました。
おっしゃる方法が一番適当なので、当面使わせていただきます。

> Blueさん
環境依存についてよくわかっていませんでした。(今も)
使用環境は学校くらいですので、環境依存は知識については知っていても経験としては全然理解しておりませんので。
すいません。
nonさんの方法では、半角カナや全角英字、全角空白は対応できませんか?

>もう少し明確に・・
後学のためどこまで書けば明確な質問か教えてください。
ちょっと、どこまで質問すれば回答者様にとって回答しやすいかわからないので・・・

Re:日本語の扱いについて

Posted: 2009年6月24日(水) 21:17
by non
>nonさんの方法では、半角カナや全角英字、全角空白は対応できませんか?

半角カナについては触れてなかったのであえて除外しましたが、
正確に言うと2バイト文字は0x81以上だけの条件ではありません。半角カタカナの範囲も
除外されています。SHIFT-JISで検索してコード表を調べればOKです。
全角英字でも、全角空白でもコード表をみればわかるはずです。