2010-05-17 2 views
2

Я работаю над интернационализацией ввода для приложения C/C++. В настоящее время я попал в проблему с преобразованием из многобайтной строки в широкую строку символов.C/C++ I18N mbstowcs question

Код должен быть совместим с платформой, поэтому я использую 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?

+1

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

+0

SMACK! (лоб) "English_United States.1252". Я думал, что я установил локаль системы по-разному. Это объясняет многое. Хотя я думал, что, когда я извлечу кодовую страницу, это будет отражать то, что было в локали. Если вы представите какой-то ответ, рассмотрите его, по крайней мере, если он не принят. – bogertron

ответ

1

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

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

1

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

+0

Что смешно сказать! Если вы работаете в Windows, обязательно используйте Win32 api, но он ясно говорит, что этот код должен быть кросс-платформенным и сразу ... * BANG * у вас проблемы! –

+0

mbstowcs не является общим. определение «w» является полностью переменным: иногда UTF-16, иногда UTF-32. Если вы хотите «generic», используйте ICU. – bmargulies