一般的なVisualC++におけるUNICODEの取り扱い
特に、ここではASCII(SHIFTJIS)ファイルをUNICODEのアプリケーションで取り扱う
場合、注意すべき点をメモしておきたいが、そこに行きついた背景も説明できればと思う
背景として
VC++6.0までは、デフォルトASCIIで文字列を扱うことが普通だったが、
.NETの到来により、UNICODEが本格的に取り扱われるようになり、開発方法も変更を余儀なくされいいる
また、先にWindowsCEでは、UNICODEのみのサポートのみであったため、
デバッグ時、CEのコードをそのまま使って、Windows上で動作させたい場合、強制的に
UNICODEの開発を余儀なくされてしまう。
そこで、極力いままでの既存コードを活用しつつUNICODEを利用するための
注意事項を下記に記載する
1.MFCを使う
STLも利用できるのだが、マルチバイトの取り扱いをCStringで吸収してくれるので、
UNICODEを意識せずに文字列を取り扱える
C++CEを使用する場合、相性がよい
2._T("")の使用
これも、1と同様、これで文字列定数を記述しておけば、ASCII,UNICODEの切り替えがよういになる
3.文字列を取り扱っている、CRT関数群は、ASCII,UNICODE互換関数を使用する
これも1と同様
要は引数に文字列を使用している場合、互換用の関数が必ずよういされているので、こちらを使用する
4.外部ファイルにおけるファイルの取り扱い
基本は、ASCIIファイル形式(SHIFTJIS形式)で統一しておいても、上記の関数を使用することで、
ファイルを読み込むときに、シングルバイトもしくはマルチバイトでメモリには取り込んでくれる
ただし、2つほど注意が必要。
まず、テキストファイル読み込む場合は、必ずテキストモードで開くこと。
もし、バイナリーモードで開いた場合、シングルバイト、マルチバイトの切り替えは行われない
(バイナリーで開いているわけだから、当然といえば当然)
もう一つの注意点だが、SHIFTJISの部分は、自動的にUNICODEに変換されるわけではない
理由は、通常文字列のなかに、SHIFTJISが使用されているかがわかっていないためで、
これをわからせるために、ロケールの定義を行う必要がある。ロケール定義は、
_tsetlocale(LC_ALL, _T(""));により、OSの規定ロケールが設定される。これをアプリケーションの
初期処理に定義しておくことで、アプリケーション内では、規定ロケールで動作することになる。
余談だが、WIndowsCE(少なくともCE5まで、6以降は確認していない)は、この定義が不要
ってか、おそらく文字列変換処理が強制的に行われる(UNICODEであることとオーバヘッドのため?)
なので、ロケール定義は行わないっというか_tsetlocale関数は存在しない
だから、これはUNICODEによるWindowsアプリを作成する場合のみ必要になる

PR