C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 105 を表示中)
■62534 / )  Re[5]: 文字コードの取得
□投稿者/ 774RR (619回)-(2011/10/17(Mon) 17:29:59)
「ファイル」ってのは要するに「単にデータ(バイト)が順番に並んでいるだけ」の代物。
そのデータをどう解釈するかは、データを扱うユーザやプログラム任せになっている。
だから SJIS だ EUC だ UTF-8 だと、いろいろなデータ形式があるんだ。

SJIS (というか cp932) では
A という文字に 41h というコードを与えている。
あ という文字に 82a0h というコードを与えている。
そして最終的に「バイトの列」として、コードの値をそのまま配置する。
なので Aあ という文字列を「バイトの列」として取り出すと 41 82 A0 となるわけだ。

fgetc() で1バイトづつ取り出すと、最初は 41 次は 82 次は A0
fgets() で1行取り出すと、バイトデータ列の先頭は 41 次は 82 次は A0

Visual C++ では _ismbblead() という関数に 41 を食わせると 0 が返ってくる
すなわち multi byte lead 文字でない = 1バイトが半角1文字分である = 41 で1文字
同様 _ismbblead() に 82 を食わせると 0以外 が返ってくる。
すなわち multi byte lead 文字である = 後続のバイトとあわせて1文字である =
(SJIS の場合) 82 と次の A0 をあわせて 82A0 で1文字である
と判断すればいいんだ。

# UTF-8 などの場合「後続のバイト」が1バイトとは限らないので注意が必要。
# cp932 (SJIS) は1バイトか2バイトかのどちらかなので簡単。

SJIS はバイト列の途中から1バイト目か2バイト目かを判断できない(こともないが困難)ので
先頭からチェックしていかなければならない。その辺注意が必要。
返信 編集キー/


管理者用

- Child Tree -