文字コードは、やっかいなもの。
以下の2つの関数は、知ってるようでよく知らなかったって話。
MultiByteToWideChar( )
WideCharToMultiByte( )
UNIコードの変換に使うもんだ、というふうに抽象的に考えていたんだけど、
MultiByte と WideCharの意味を全然理解してなかったことが判明した。
今回学んだことを記しておこうと思う。
MultiByte → 文字種によってByte数が可変
WideChar → 文字種によってByte数が一定
きっかけはSolidWorks2007関係のトラブル。
SolidWorksドキュメントに文字情報を書き込んだり、読んだりする処理がある。
ファイルのカスタムプロパティってやつだ。
日本語を書き込んだ場合に、それを読むと文字化けする。
2006までは問題なかったのに、2007で作ったデータだと問題発生。
どうやら、2007で書き込んだときに特殊な文字コードで書き込むように
なっているということがわかった。
2006までは、Shift-JISで書き込まれていたんだけど、
2007では正体不明の文字コードで書かれている。
もろもろの調査により、UTF-8というUNICODEの一種だということがわかった。
(秀丸君が大変役に立った。)
UNICODEだったら、WideCharToMultiByte( )を使って
Shift-JISに変換すればいいだろぉと考えたけど、
どうやってもうまくいかない。
MSDNのドキュメントを読んでもわけわからんし、悶々とした時間を過ごした。
結論。
Shift-JISもUTF-8も両方とも、MultiByte。
UTF-8をShift-JISに変換するなら、
MultiByteToWideChar実行後、結果をWideCharToMultiByteに渡して、
この結果が答えというわけ。
Shift-JISは、ASCIIが1バイトで日本語なんかが2バイトだから典型的なMultiByte。
UTF-8は、文字種によって1~6バイトで可変なんだって。
これまたMultiByteってこと。
UNICODEの一種だから、どんな文字でも一定のバイト数で表現されると
思い込んでいたけどちがったわけだ。
じゃー、WideCharってなんなんだろ?
まだ理解が足りないな。
奥が深い世界だ...。
しかし、SolidWorksにしろAutoCADにしろ、毎年毎年よくまぁ
バージョンアップするもんだよ。
まだ2006年だってのに、バージョンは2007だし。
ユーザーもついていくのが大変だろうけど、
関わるソフト開発者も苦労が多いーよ。
はぁ。
ユニコードからANSIへ変換
LPSTR szAnsi; int len = ::WideCharToMultiByte(CP_ACP, 0, szUnicode, -1, NULL, 0, NULL, NULL); szAnsi = (LPSTR) malloc(len + 1); memset(szAnsi,0,len + 1); ::WideCharToMultiByte(CP_ACP, 0, szUnicode, -1, szAnsi, len, NULL, NULL); return szAnsi..