- 締切済み
Unicode
先日は文字コードについて色々助言してくださりありがとうございました。 おかげさまでJIS,EUC,SJISの変換はできましたが、 Unicodeについて詰まっているところがあります。 SJIS→UnicodeはSJISにあったU+XXXXに変換し、 それを1~4バイトにさらに変換して文字表記されることで出来ます。 後者の1~4バイトにさらに変換するやり方は出来ているのですが、 前者のSJISにあったU+XXXXに変換するところで詰まっています。 ##SJIS Unicode Name Note 0x00 U+0000 # <control> 0x01 U+0001 # <control> 0x02 U+0002 # <control> 0x03 U+0003 # <control> 0x04 U+0004 # <control> 0x05 U+0005 # <control> 0x06 U+0006 # <control> 0x07 U+0007 # <control> : : こういった変換表(テキストファイル)があるのですが、 どのようにしたらこのファイルをプログラム上で操作? できるのでしょうか? 例)SJISで0x07→U+0007→1~4バイト変換の 0x07→U+0007部分についてです。 また、逆に変換する際の0x07←U+0007についても わからないでいます。 何かヒントをください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- nda23
- ベストアンサー率54% (777/1415)
参考URLに解説でてるんですがねぇ・・・ 以下はコーディング例です。 #include<windows.h> /** SHIFT-JISの文字列をUniCodeに変換し、その領域のポインタを返す 返されたポインタは使用後、free()で解放すること */ static LPWSTR sjis_uni(LPSTR sjis) { size_t size = MultiByteToWideChar(CP_ACP,0,sjis,-1,NULL,0); LPWSTR p = (LPWSTR)malloc(size << 1); MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,sjis,-1,p,size); return p; } /** UniCodeの文字列をSHIFT-JISに変換し、その領域のポインタを返す 返されたポインタは使用後、free()で解放すること */ static LPSTR uni_sjis(LPWSTR uni) { size_t size = WideCharToMultiByte(CP_ACP,0,uni,-1,NULL,0,NULL,NULL); LPSTR p = (LPSTR)malloc(size); WideCharToMultiByte(CP_ACP,0,uni,-1,p,size,NULL,NULL); return p; } //----- LPSTR sj = read(); //ファイルからSHIFT-JIS読み込み LPWSTR uc = sjis_uni(sj); //UniCodeに変換 write(uc); //ファイルに書き込み free(uc); //メモリ解放 //----- LPWSTR uc = read(); //ファイルからUniCode読み込み LPSTR sj = uni_sjis(uc); //SHIFT-JISに変換 write(sj); //ファイルに書き込み free(sj); //メモリ解放 read()、write()は架空の関数です。
- nda23
- ベストアンサー率54% (777/1415)
MultiByteToWideCharやWideCharToMultiByteは使っていないのですか? http://msdn.microsoft.com/ja-jp/library/cc448053.aspx http://msdn.microsoft.com/ja-jp/library/cc448089.aspx
補足
使っていません。 前回アドバイスいただきましたが、それらの関数の使い方も よくわからなかったので、原始的な方法でやってます。 今回のはファイルとして読みだして、0xYYを検索し、 該当するU+YYYYを抽出(うまくできるかな??)しようと 思っていますが、まだじっくりとは考えていません。