■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バイト目かを判断できない(こともないが困難)ので 先頭からチェックしていかなければならない。その辺注意が必要。
|
|