• ベストアンサー

UNICODE化のための書き換え

お世話になります。 Visual stdio 2010 C++で作成しております。 以前までは、UNICODEを意識しておらず、  char  const unsigned char* を使用していました。 UNICODE化を意識して  char→TCHAR に変更しているのですが、  const unsigned char* はどのように書き換えればよいのでしょうか? ※LPCTSTRだけだと意味が変わってしまう気がして。。。 お手数ですがよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

>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)
回答No.3

TCHAR がどのように定義されているのかは知りませんが, typedef を使っているのであれば const unsigned TCHAR* は正しくありません. 「型名が使用できません」というエラーはこのことを言っていると思われます. TCHAR に相当する unsigned バージョンが用意されていればそれを使って終わりなんだけど, そうでないと難しいなぁ.

全文を見る
すると、全ての回答が全文表示されます。
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

まず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)を期待しているからです。

kgyqk433
質問者

補足

お返事ありがとうございます。 頂いたアドバイスを元に _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* から意味が変わっているように思えて困っております。 大変お手数ですが補足頂ければと思いますので 何卒よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • UNICODEとANSIの対応でunsigned addr[][100] は、どのように書き換えればよいのでしょうか?

    UNICODEとANSIの両方対応できるようにtchar.hをインクルードして、 char *s → LPTSTR s char a → TCHAR a などしてきましたが、 unsigned addr[][100] は、どのように書き換えればよいのでしょうか? また、_TCHARとTCHARはどちらを使えばよいのでしょうか?

  • const unsigned char *Ptn

    度々お世話になってます。VC++2010、MFC、ユニコードを使う設定で、ワイルドカードを用いたLike処理が使いたいです。 正規表現までは、望んでいません。 それで、過去ログを見てみましたが、まだ分かりませんでした。 ◆ワイルドカードを用いた文字列検索 http://okwave.jp/qa/q287644.html を使いたいです。 一応、リンク先のソースコードを載せておきます。 _________________________________________________________________________________________________ int StrMatchMBS( const unsigned char *Ptn, const unsigned char *Str ) {   switch( *Ptn )   {     case '\0':       return (_mbsnextc(Str)=='\0');     case '*':       return StrMatchMBS( _mbsinc(Ptn), Str ) || (_mbsnextc(Str)!='\0') && StrMatchMBS( Ptn, _mbsinc(Str) );     case '?': return (_mbsnextc(Str)!='\0') && StrMatchMBS( _mbsinc(Ptn), _mbsinc(Str) );     default:       return (_mbsnextc(Ptn)==_mbsnextc(Str)) && StrMatchMBS( _mbsinc(Ptn), _mbsinc(Str) );   } } _________________________________________________________________________________________________ int KeywordDlg::StrMatchMBS( const unsigned TCHAR *Ptn, const unsigned TCHAR *Str ){ としたところ、 エラー 4 error C2050: switch 式の結果は、整数値になりませんでした。 エラー 3 error C2065: 'Ptn' : 定義されていない識別子です。 ・・・のエラーがでます。 _________________________________________________________________________________________________ int KeywordDlg::StrMatchMBS( const TCHAR *Ptn, const TCHAR *Str ){ としたところ Ptn と Str の所で、赤い波線となり、 エラー 2 error C2664: '_mbsinc' : 1 番目の引数を 'const TCHAR *' から 'const unsigned char *' に変換できません。(新しい機能 ; ヘルプを参照) _________________________________________________________________________________________________ ↓この方の質問のままなのですが、具体的に どう書けばいいのか?分かりません。 ◆UNICODE化のための書き換え http://okwave.jp/qa/q6966243.html _tcsrchr もどこで使えばいいのか分かりません。 ポインターの記述を完全に理解していないせいで、分からないのでしょうか? すみませんが、もう少し、補足して頂くとうれしいですm(_ _)m

  • Cランタイムライブラリのヘッダでエラーが出る

    文字列クラスを作成しているのですが、コンパイルしたところ、 以下の様なエラーが出ました。 エラー E2268 C:\bcc55\Include\tchar.h 641: 未定義の関数 'strlen' を呼び出した(関数 _strncnt(const char *,unsigned int)) これはどういうことなのでしょうか。なぜ「tchar.h」でエラーが出るのでしょうか。どなたか原因が分かる方はいらっしゃらないでしょうか。 ちなみに、環境はWindows XP、Borland C++ 5.5.1です。

  • WritePrivateProfileString

    Visual C++で、 unsigned char*型の変数を、一旦ファイルに保存しておいて、 後にそれを読み込んで使用する、ということをしたいのですが、 GetPrivateProfileStringとWritePrivateProfileStringを利用しようと考えました。 具体的にはPC-OP-RS1という製品を使った、 テレビのリモコンプログラムなんですが、 このデバイスの操作APIが、 赤外線信号をunsigned char*型で受け取ります。 これをファイルに記述しておいて、 好きなときに呼び出したいのですが、 前述の2つの関数は、 渡せる方がLPCTSTR型となっていますが、これがよくわかりません。 どうすれば実現できるでしょうか? 別の方法を取ったほうがいいでしょうか?

  • constの位置

    申し訳ありませんが、続けて質問させていただきます。 char const と const char は同じ意味でしょうか。 次のプログラムは配列をconst charと宣言しています。 ary[1]='N'; の行で、意図した通りにコンパイルエラーになります。 これはchar constと宣言しても、同じ意味なんでしょうか。 #include <stdio.h> int main(void) { const char ary[ ] = { 'A', 'B', 'C', '\0' }; ary[1] = 'N'; printf("aryは%s\n", ary ); return 0; } また、 const int a=1; int const a=1; この2つは同じ意味でしょうか。

  • char型変数をLPCTSTR型に変換したい

    大学の研究でプログラム作成している者です. 現在外部ファイルの文字列をfscanf()でchar型変数に取り込み,それをLPCTSTR型変数に変換して,関数に引数として渡そうとしてます. しかし,現在はchar/THCARの変換が正しくできず困っております.現在のコードは以下のような流れになってます. ----------------------------------------------- char name[MAX_PATH]; TCHAR name_t[MAX_PATH]; fscanf( &fp, "%s", name ); wsprintf( name_t, _T("%s"), &name ); // char ⇒ TCHAR makedFunction( name_t ); // 自作関数(引数はLPCTSTR) ----------------------------------------------- しかし, wsprintf()で変換した時点で,文字列がおかしくなってしまい困ってます. 開発環境はVisualStudio2010で,MFC作成(Unicode文字列)となってます.ちなみにマルチバイト文字列を使用する解決方法はなしとします. 解決方法をご存知の方がおられましたら,是非とも,ご回答よろしくお願い致します.

  • char型の文章をconst char*型に変換

    Visual C++ MFCでアプリケーション作成している者です。 現在、エディットコントロールに入力したファイルパスを取り込んで、ファイルのデータ読み込みをおこなうプログラムを作成しております。 しかし、当方プログラムの型など細かいことがあまりわからないため、目的が達成できず困っていたので、この場をお借りして質問しました。 コードの感じは以下のようになっております。 ------------------------------------------ TCHAR FPath;  // ファイルパスが入る FILE *fp; m_edit.GetWindowText( FPath, MAX_PATH ); // m_edit:エディットコントロールのメンバ変数 fopen_s( &fp, [FPathのconst char*], "r" ); ------------------------------------------- char型からconst char型へ変換できればいいのですが、ちょっとよくわからず… ご回答、宜しくお願い致します。

  • c++ TCHARで文字化け

    TCHARはUNICODEが扱えるときいたので早速つかってみた。以下は引数を表示するプログラムである。 Visual C++ Express Editionを使った。 #include <stdio.h> #include <tchar.h> int _tmain(int argc, _TCHAR* argv[]) { int i=0; while(i<argc){ _tprintf(_T("%s\r\n"),argv[i++]); } return 0; } しかし上記プログラムに日本語の引数をわたすと文字化けするではないか。なでしょうか?

  • c言語関数の(1)~(5)までの部分が何をやっているのかよく分からない

    c言語関数の(1)~(5)までの部分が何をやっているのかよく分からないので、どなたか解説をお願いします。 int memcmp(const void *s1, const void *s2, size_t n) { const unsigned char *p1 = (const unsigned char *)s1; const unsigned char *p2 = (const unsigned char *)s2; while (n-- > 0) { if (*p1 != *p2) return (*p1 - *p2); p1++; p2++; } return (0); } return (*p1 - *p2); > (1) ---------------------------------------------------------------------- char *strcat(char *s1, const char *s2) { char *p = s1; while (*s1) s1++; /* s1を末尾まで進める */ while (*s1++ = *s2++) ; /* '\0'が見つかるまでs2をコピー */ return (p); } while (*s1++ = *s2++) ; > (2) ---------------------------------------------------------------------- char *strstr(const char *s1, const char *s2) { const char *p1 = s1; const char *p2 = s2; while (*p1 && *p2) { if (*p1 == *p2) { p1++; p2++; } else { p1 -= p2 - s2 - 1; p2 = s2; } } return (*p2 ? NULL : (char *)(p1 - (p2 - s2))); } while (*p1 && *p2) > (3) p1 -= p2 - s2 - 1; > (4) ---------------------------------------------------------------------- char *strcpy(char *s1, const char *s2) { char *p = s1; while (*s1++ = *s2++) ; return (p); } while (*s1++ = *s2++)   > (5) ;          > (5) ----------------------------------------------------------------------

  • wParam

    wParamは、unsigned int型で、仮想キーコードを、格納してますよね。 wsprintf()内で(TCHAR)キャストしてますが、 これは、変数strの型がTCHAR型なので(wParamは、unsigned intなので型をあわせるために)やっているんですか? (TCHAR)キャストしないとエラーになりますか?教えてください。 HDC hdc; TCHAR str[255]; swich(umsg){   case WM_CHAR:     wsprintf( str, TEXT("%c"), (TCHAR)wPara );     hdc = GetDC(hwnd);     TextOut(hdc, 0, 0, str, lstrlen(str));     return0 }