2

私はC/C++アプリケーションの入力の国際化に取り組んでいます。現在、マルチバイト文字列からワイド文字列への変換で問題が発生しています。

コードはクロスプラットフォーム互換である必要があるため、可能な限りmbstowcsとwcstombsを使用しています。

私は現在WIN32マシンで作業しており、ロケールを英語以外のロケール(日本語)に設定しました。

マルチバイト文字列を変換しようとすると、変換の問題が発生しているようです。

コードの例を次に示します。

int main(int argc, char** argv)
{
    wchar_t *wcsVal = NULL;
    char *mbsVal = NULL;

     /* Get the current code page, in my case 932, runs only on windows */
     TCHAR szCodePage[10]; 
     int cch= GetLocaleInfo( 
             GetSystemDefaultLCID(), 
             LOCALE_IDEFAULTANSICODEPAGE,  
             szCodePage,  
             sizeof(szCodePage)); 

     /* verify locale is set */
     if (setlocale(LC_CTYPE, "") == 0)
     {
        fprintf(stderr, "Failed to set locale\n");
        return 1;
     }

    mbsVal = argv[1];
         /* validate multibyte string and convert to wide character */
    int size = mbstowcs(NULL, mbsVal, 0);
    if (size == -1)
    {
        printf("Invalid multibyte\n");
        return 1;
    }
    wcsVal = (wchar_t*) malloc(sizeof(wchar_t) * (size + 1));
    if (wcsVal == NULL)
    {
        printf("memory issue \n");
        return 1;
    }

    mbstowcs(wcsVal, szVal, size + 1);
    wprintf(L"%ls \n", wcsVal);         
    return 0;
}

実行の最後に、ワイド文字列には変換されたデータが含まれていません。MultiByteToWideCharを使用して現在のコードページを送信すると、コードページの設定に問題があると思います。

例:MultiByteToWideChar(CP_ACP、0、mbsVal、-1、wcsVal、size + 1); mbstowcs呼び出しの代わりに、変換は成功します。

私の質問は、MuliByteToWideChar呼び出しの代わりに一般的なmbstowcs呼び出しをどのように使用するかです。

4

2 に答える 2

1

Windows で mbstowcs を呼び出すことは、MultiByteToWideChar ほど良い考えではありません。これを理解する必要はありません。Win32 API に固執してください。

于 2010-05-17T23:37:18.717 に答える
1

によって返された文字列を出力するとどうなりますsetlocale()か? これにより、実際に設定されているロケールが示されますが、これは期待したものではない可能性があります。

MSDN は、Windows で選択された既定のロケール""「オペレーティング システムから取得したユーザー既定の ANSI コード ページ」であることを示しています。おそらく、これは現在のANSI コード ページとは別物なのでしょうか?

于 2010-05-18T00:01:10.027 に答える