После долгих поисков остановился на следующем решении: изменяю все строки с wchar_t на char и так уже сохраняю. Функции преобразования
wchar_t *MyMultiByteToWideChar(const char *s) { #ifdef WIN32 int i = 0; i = (int)MultiByteToWideChar(CP_ACP ,MB_PRECOMPOSED,s,-1,NULL,0); wchar_t *d=(wchar_t *)malloc((i+1)*sizeof(wchar_t)); i=(int)MultiByteToWideChar(CP_ACP ,MB_PRECOMPOSED,s,-1,d,i); d[i]=0; return d; #else const char *ss=s;
int i=(int)mbsrtowcs(NULL,&ss,0,NULL); if (i<0) return NULL; wchar_t *d=(wchar_t *)malloc((i+1)*sizeof(wchar_t)); mbsrtowcs(d,&s,i,NULL); d[i]=0;
return d; #endif }
char *MyWideCharToMultiByte(const wchar_t *s) { #ifdef WIN32 UINT codePage=CP_ACP;
int i=(int)WideCharToMultiByte(codePage, // code page 0, // performance and mapping flags s, // wide-character string -1, // number of chars in string NULL, // buffer for new string 0, // size of buffer NULL, // default for unmappable chars NULL // set when default char used ); if (i<0) return NULL; char *d=(char*)malloc(i+1); WideCharToMultiByte(codePage, // code page 0, // performance and mapping flags s, // wide-character string -1, // number of chars in string d, // buffer for new string i, // size of buffer NULL, // default for unmappable chars NULL // set when default char used ); d[i]=0; return d; #else const wchar_t *ss=s;
int i=(int)wcsrtombs(NULL,&ss,0,NULL); if (i<0) return NULL; char *d=(char *)malloc(i+1); wcsrtombs(d,&s,i,NULL); d[i]=0;
return d; #endif }
Для замены функций _wgetcwd _wchdir _wfindfirst _wfindnext _findclose использовал chdir getcwd opendir readdir stat closedir.
|