Я работаю над интернационализацией ввода для приложения 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?
Что вы получите, если напечатаете строку, возвращаемую 'setlocale()'? Это укажет, какой язык был установлен. – caf
SMACK! (лоб) "English_United States.1252". Я думал, что я установил локаль системы по-разному. Это объясняет многое. Хотя я думал, что, когда я извлечу кодовую страницу, это будет отражать то, что было в локали. Если вы представите какой-то ответ, рассмотрите его, по крайней мере, если он не принят. – bogertron