LINUX.ORG.RU

mbstowcs + MinGW32 : (char * ) UTF-8 to wchar_t


0

1

Пишу несложный двух-панельный файловый менеджер, для себя. На Python+C/PDCurses. Чтобы работал и в среде Linux, и в среде Windows.
Когда-то написал уже, но исходники потерял. Сейчас восстанавливаю код.

Вот такой кусок под виндой не работает:

  unsigned char *s;
#define MAXBUF 255
  wchar_t buf[MAXBUF];
  PyArg_ParseTuple(args, "es", "utf-8", &s);
  printf("%02X %02X\n", s[0], s[1]);

  setlocale(LC_ALL,"ru_RU.UTF-8");
  mbstowcs(buf,s,MAXBUF); // see http://www.linux.org.ru/forum/development/504868#comment-504900
  printf("%02X %02X\n", buf[0], buf[1]);

  wchar_t buf2[] = L"Тест";
  printf("%04X %04X\n", buf2[0], buf2[1]);
Под Линуксом функция mbstowcs() нормально переводит строку UTF-8 -> wchar_t:
$ ./lc.py 
D0 A2
422 435
0422 0435
Под виндой (MinGW32) не срабатывает:

$ ./lc.py 
D0 A2
D0 A2
0422 0435

Проблема - в MinGW32?
Что-то подобное говорили на ЛОРе здесь: вопрос про wchar_t (комментарий) («Если интерисует переносимость в Windows то есть проблемы с mingw»)

★★★★★

Вот здесь - http://sourceforge.net/mailarchive/forum.php?thread_name=4A96A829.70000@xs4al...
пишут:
To convert the utf8 data to wide characters use
MultiByteToWideChar(CP_UTF8, ...) instead of mbstowcs(), because MINGW
mbstowcs() will assume your data is encoded in the Windows ansi system
code page regardless of LANG or LC_CTYPE environment variables. For an
example you can have a look at my latest wcd version 5.1.0
(http://www.xs4all.nl/~waterlan/).

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

Всё, проблему решил. Да, MinGW32 не умеет нормально делать mbstowcs(). Пришлось использовать MultiByteToWideChar():

http://msdn.microsoft.com/en-us/library/windows/desktop/dd319072(v=vs.85).aspx

P.S. Мало ли, кому-то пригодится при написании кроссплатформенных приложений ...

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

У MinGW нет никакой своей mbstowcs MSDN надо внимательнее читать

setlocale:

The set of available languages, country/region codes, and code pages includes all those supported by the Win32 NLS API except code pages that require more than two bytes per character, such as UTF-7 and UTF-8. If you provide a code page like UTF-7 or UTF-8, setlocale will fail, returning NULL.

Тайный смысл говорить винде setlocale(LC_ALL,«ru_RU.UTF-8») мне не ясен.

anonymous
()
Ответ на: комментарий от anonymous

Hint hint:

У MinGW вообще ничего своего нет. Она использует MSVCRT.

anonymous
()

винда поддерживает только 8-битные кодировки в консоли, локали называются по другому, например

setlocale(LC_ALL,«Russian_Russia.1251»)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.