Я получаю необъяснимые ошибки (возвращаемое значение -1) от vswprintf
с использованием GCC и Mac OS X (проверено с помощью gcc 4.0 и 4.2.1 под Mac OS X 10.6 и 10.8. под Linux - нет. Visual Studio также не пострадавших).vswprintf не работает для определенных кодов unicode под Mac OS X
Чтобы продемонстрировать эту проблему, я минимально адаптированный пример из here так, что он печатает vswprintf
«s возвращаемое значение:
/* vswprintf example */
#include <stdio.h>
#include <stdarg.h>
#include <wchar.h>
void PrintWide (const wchar_t * format, ...)
{
wchar_t buffer[256];
va_list args;
va_start (args, format);
int res = vswprintf (buffer, 256, format, args);
wprintf (L"result=%d\n", res);
fputws (buffer, stdout);
va_end (args);
}
int main()
{
wchar_t str[] = L"test string has %d wide characters.\n";
PrintWide (str, wcslen(str));
return 0;
}
Из моих тестов кажется, что, в зависимости от значения str
, vswprintf
будет иногда терпят неудачу. Примеры:
wchar_t str[] = L"test string has %d wide characters.\n"; // works
wchar_t str[] = L"ßß® test string has %d wide characters.\n"; // works
wchar_t str[] = L"日本語 test string has %d wide characters.\n"; // FAILS
wchar_t str[] = L"Π test string has %d wide characters.\n"; // FAILS
wchar_t str[] = L"\u03A0 test string has %d wide characters.\n"; // FAILS
Оказывается, что все строки, содержащие символы с Unicode кодовых выше 0xff
вызовет эту проблему. Может ли кто-нибудь пролить свет на то, почему это происходит? Кажется, слишком большой вопрос, которого раньше не было замечено!
кодировка исходного файла соответствует ли кодированию ожидаемого в строках? – Dmitri
Я бы ожидал, что вызов 'fputws' завершится неудачей в стандартном' 'C '' локали для символов вне диапазона, но 'vswprintf' должен работать. –
В заголовке нет «GCC vswprintf». Причина, по которой GCC на GNU/Linux ведет себя по-разному с GCC на Mac OS X, заключается в том, что 'vswprintf' не имеет ничего общего с GCC, она предоставляется библиотекой C операционной системы,' libc' –