PMG
http://forum.pmg.org.ru/

UTF-16 & Linux
http://forum.pmg.org.ru/viewtopic.php?f=4&t=6685
Страница 1 из 1

Автор:  Горыныч [ 20 июн 2008 23:32 ]
Заголовок сообщения:  UTF-16 & Linux

Доброго времени суток всем.
Сделал небольшой класс Log, все сообщения в котором храняться в
виде std::wstring и вообще в програмке вся символьная информация храниться
в wchar_t. Все прекрасно компилируеться под Windows, а вот под Linux'ом
не найдены следующие функции: _wfopen vswprintf.
Может кто подскажет как решить проблему
P.S. Заодно хотелось спросить как можно заменить функции:
_wgetcwd _wchdir _wfindfirst _wfindnext _findclose

Автор:  MagicWolf [ 23 июн 2008 08:37 ]
Заголовок сообщения:  Re: UTF-16 & Linux

Никогда не компилировал под Linux, ничего не могу сказать ...

Автор:  Горыныч [ 06 сен 2008 16:25 ]
Заголовок сообщения:  Re: UTF-16 & Linux

После долгих поисков остановился на следующем решении:
изменяю все строки с 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.

Автор:  kornerr [ 18 фев 2010 19:45 ]
Заголовок сообщения:  Re: UTF-16 & Linux

У меня mbstowcs/wcstombs работали также и под Windows (MinGW).
Учитывая то, что wchar_t 4 байта, можно тему назвать UTF-32 & Linux.

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/