- ベストアンサー
UNICODE化のための書き換え
お世話になります。 Visual stdio 2010 C++で作成しております。 以前までは、UNICODEを意識しておらず、 char const unsigned char* を使用していました。 UNICODE化を意識して char→TCHAR に変更しているのですが、 const unsigned char* はどのように書き換えればよいのでしょうか? ※LPCTSTRだけだと意味が変わってしまう気がして。。。 お手数ですがよろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>wcsrchr((const unsigned TCHAR*)buf,(unsigned int)c;に変えたのですが、「型名が使用できません」のエラーがでます。 wcsrchrの第一引数の型がunsignedでないので当然です。 ひょっとして前は相当古いコンパイラを使っていなかったでしょうか?(VC6等) 型チェックが厳密でないコンパイラだと通っていたかもしれません。 仮にUNICODEでないとしても 正しくキャストしないとコンパイルエラーになります。 例えばstrrchr( (const unsigned char*)buf , (unsigned int)c ); これはvc2010でエラーになります。UNICODEかどうかとは別問題です。 さらにいえば wcsrchrはwchar_t専用の関数です。 TCHAR用には_tcsrchrが用意されておりこちらを使うべきです。 http://msdn.microsoft.com/ja-jp/library/ftw0heb9(v=VS.100).aspx >wcsrchr((const TCHAR*)buf,(unsigned int)c;にするとコンパイルは通るのですが、元のconst unsigned char* >から意味が変わっているように思えて困っております。 このケースでいえばunsignedを外すキャストしているだけなので、関数内部での動作は影響しません。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
TCHAR がどのように定義されているのかは知りませんが, typedef を使っているのであれば const unsigned TCHAR* は正しくありません. 「型名が使用できません」というエラーはこのことを言っていると思われます. TCHAR に相当する unsigned バージョンが用意されていればそれを使って終わりなんだけど, そうでないと難しいなぁ.
- sha-girl
- ベストアンサー率52% (430/816)
まずTCHARとはなんなのかを意識する必要があります UNICODEがdefineされていれば wchar_tとなり、そうでなければcharに置き換わります。 >const unsigned char* >はどのように書き換えればよいのでしょうか? const unsigned char* が何を期待しているかに依ります。 例えばUNICODE環境でconst unsigned wchar_t*を期待しているのであればconst unsigned TCHAR*となります。 ※LPCTSTRはconst TCHAR*なので符号比較をしている箇所があれば意味が変わります。 ただUNICODEがdefineされている環境以外でコンパイルする事がないのなら TCHARでなくwchar_tをそのまま使っても良いかと思います(実際現在のDirectX_SDKのサンプルコードではTCHARは使わずwchar_tを指定しています) またユニコードでもUTF8で文字列を扱っている箇所は通常charを使うので使い分けが必要なケースもあります。 ※wchar_tは環境依存なので気をつける必要があります。sizeof(wchar_t)はWin+VC2010なら2かもしれませんが solaris+gcc4なら4だったりします(たしかコンパイラで指定可能)。 これはwinの場合文字コードがUTF16を期待しているのに対して solarisはUTF32(UCS4)を期待しているからです。
補足
お返事ありがとうございます。 頂いたアドバイスを元に _mbsrchr(const unsigned char*)buf,(unsigned int)c; をUNICODE化のため、 _mbsrchr((const unsigned TCHAR*)buf,(unsigned int)c; とすると、「型名が使用できません」のエラーがでますので、 wcsrchr((const unsigned TCHAR*)buf,(unsigned int)c; に変えたのですが、「型名が使用できません」のエラーがでます。 wcsrchr((const TCHAR*)buf,(unsigned int)c; にするとコンパイルは通るのですが、元の const unsigned char* から意味が変わっているように思えて困っております。 大変お手数ですが補足頂ければと思いますので 何卒よろしくお願い致します。