C / C ++ I18N Mbstowcs вопрос - PullRequest
2 голосов
/ 18 мая 2010

Я работаю над интернационализацией ввода для приложения 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 и мне отправляют текущую кодовую страницу в

EX: MultiByteToWideChar ( CP_ACP, 0, mbsVal, -1, wcsVal, размер + 1 ); вместо вызовов mbstowcs преобразование завершается успешно.

У меня вопрос: как использовать общий вызов mbstowcs вместо вызова MuliByteToWideChar?

Ответы [ 2 ]

1 голос
/ 18 мая 2010

Что вы получите, если напечатаете строку, возвращенную setlocale()? Это будет указывать, какой языковой стандарт был фактически установлен, что может не соответствовать ожидаемому.

MSDN указывает , что в Windows языком по умолчанию, выбранным для "", является "кодовая страница ANSI по умолчанию, полученная из операционной системы" . Возможно, это отличается от существующей текущей кодовой страницы ANSI?

1 голос
/ 18 мая 2010

Вызов mbstowcs никогда не был такой хорошей идеей, как MultiByteToWideChar в Windows. Не пытайтесь понять это, просто придерживайтесь API Win32.

...