匿名質問者

char がマルチバイト文字をどのように認識しているかを的確に説明してくれるサイトを教えてください。

'A'はint型だと認識されるしutf-8ではマルチバイト文字を使いますがそれでもchar型は動きます。
正直もうわけがわかりません。そしてこの質問があまり一般的ではないことにも驚いています。私がgoogleをうまく使いこなせていないだけかもしれませんが。
例)
#include <stdio.h>
int main(){
char s[] = "やさしい世界\n";
while(s[i] != '\0')
putchar(str[i++]);
return 0;
}

//失敗例)
#include <stdio.h>
int main(){
char s[] = "やさしい世界\n";
while(s[i] != '\0'){
printf(",%d : ",i);
putchar(str[i++]);
}
return 0;
}

//ソースここまで
おそらくutf-8の場合最初のバイトを見て判断しているのではないかと思いますがわかりません。
できるだけ詳しくマルチバイト文字が1文字をどのように認識しているか説明してくれるサイトまたは私がウェブで検索するキーワードとなる単語を教えてください。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/10/01 20:58:31

ベストアンサー

匿名回答1号 No.1

char は、マルチバイト文字を認識しません。

Programming Place Plus C言語編 第46章 マルチバイト文字

他3件のコメントを見る
匿名質問者

おそらくこの回答が一番私の理解を助けてくれたのではないかと思います。
OSが関わっているのかなどを考えていましたが端末の中で文字列が解釈される、
これが私の知りたいどこで、の答えではないかと思います。
cは単に1バイトづつ処理しているだけなんですね。
なぜこのことが様々の参考書に書かれていないのか、なぜ前例となる質問がとても少ないのかわかりませんが、同じ疑問を持った人が見てくださると嬉しいです

2013/10/01 20:58:22
匿名回答1号

3号さんへ
UTF-16 の話は、次の章に載ってます。
http://www.geocities.jp/ky_webid/ProgrammingPlacePlus/c/047.html
マルチバイト文字とワイド文字は、ややこしいですよね。

2013/10/04 03:57:45

その他の回答1件)

匿名回答1号 No.1

ここでベストアンサー

char は、マルチバイト文字を認識しません。

Programming Place Plus C言語編 第46章 マルチバイト文字

他3件のコメントを見る
匿名質問者

おそらくこの回答が一番私の理解を助けてくれたのではないかと思います。
OSが関わっているのかなどを考えていましたが端末の中で文字列が解釈される、
これが私の知りたいどこで、の答えではないかと思います。
cは単に1バイトづつ処理しているだけなんですね。
なぜこのことが様々の参考書に書かれていないのか、なぜ前例となる質問がとても少ないのかわかりませんが、同じ疑問を持った人が見てくださると嬉しいです

2013/10/01 20:58:22
匿名回答1号

3号さんへ
UTF-16 の話は、次の章に載ってます。
http://www.geocities.jp/ky_webid/ProgrammingPlacePlus/c/047.html
マルチバイト文字とワイド文字は、ややこしいですよね。

2013/10/04 03:57:45
匿名回答4号 No.2

 マルチバイト文字といえば(Windows でポピュラーなエンコーディングは)Shift_JIS が思い浮かびますが、これについてはマルチバイト文字用のライブラリ関数を使わなければ、正しい結果が得られません。
 ASCII の1文字は1バイトですが、Shift_JIS の1文字は1バイトだったり2バイトだったりするからです。
http://msdn.microsoft.com/ja-jp/library/6y9se58z%28v=vs.90%29.aspx

 従って、1バイトずつ「ぶった切る」ような事をすれば、Shift_JIS文字列はもはや Sjift_JIS としての形を為しません。



<以下余談>

1.マルチバイト文字には Shift_JIS も含まれますが、C で扱う Shift_JIS文字列の終端文字は '\0' つまり 0 ですので、「0x00 が登場しない」と言ってしまうと語弊があると思います。
 確かに 0 は文字列に含まれないですが(strlen は 0 を数えない)、そう言うならば通常の文字列にも 0x00 は登場しない事になりますから、わざわざ「マルチバイト文字の中に」と断る意味は有りません。

2.ワイド文字は wchar_t型を用います。この「入れ物」には UTF-16 が入れられたり、UTF-32 が入れられたりします(Windows NT では UTF-16、Linux・Mac OS Xでは UTF-32 が入っているようです)。ワイド文字の「ヌル文字」は L'\0' です。
 マルチバイト文字とワイド文字は違う話なので、混同しないようにしましょう。

3.ロケール locale についても調べてみると良いでしょう。
http://simd.jugem.jp/?eid=22
http://others2.blog.so-net.ne.jp/2010-09-24

 C の char は、それ自体は「単なる1バイトの入れ物」であって、内容値が ASCII なのか Shift_JIS なのか EUC なのか UTF-8 なのかという事には関与していません(そもそも char は整数値型であって文字型ではありません)。
 char型領域にある整数値が、どのような地域ルールに従って文字表現されるのか、それを決める環境要素がロケール指定だと考えていただいて差し支えないと思います。

 ロケールがどういう働きをするか、ざっと示すと以下のようです(この点は他の回答者様からのご指摘も待ちたいと思います)。

a)アプリケーション側で、使われるロケールを設定しておく
a1)char型領域や wchar_t型領域にあるのはあくまで整数値
a2)シングルバイト文字、マルチバイト文字、ワイド文字などの内容値に合わせたライブラリ関数による文字処理

b)アプリケーションを実行・デバイスに表示(OS の仕事)
b1)アプリケーションでロケール未設定だと、「その地域のロケール」が採用される。
b2)アプリケーションの出力する文字コード値を、ロケールに従って表示する。

4.Windows系の場合、コードページについても調べてみると良いでしょう。これはもはや C の話ではないのですが、文字を最終的に出力する際の文字化けについて語る上では、欠かせない事です。
http://msdn.microsoft.com/ja-jp/library/aa288104%28v=vs.71%29.aspx

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません