swprintf душит символы за пределами 8-битного диапазона - PullRequest
3 голосов
/ 21 июня 2010

Это происходит в OS X, хотя я подозреваю, что это применимо к любой UNIX-y ОС.У меня есть две строки, которые выглядят так:

const wchar_t *test1 = (const wchar_t *)"\x44\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00";
const wchar_t *test2 = (const wchar_t *)"\x44\x00\x00\x00\x19\x20\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00";

В отладчике test1 выглядит как «Ds», а test2 - как «D» (с фигурным апострофом).Затем я вызываю этот код:

wchar_t buf1[100], buf2[100];
int ret1 = swprintf(buf1, 100, L"%ls", test1);
int ret2 = swprintf(buf2, 100, L"%ls", test2);

Первый вызов swprintf работает нормально.Второй возвращает -1 (и буфер не изменяется).

Я предполагаю, что проблема как-то связана с локалями, но поиск в Google не дал мне ничего полезного.Это самый простой способ воспроизвести проблему, которую я вижу.Что меня действительно интересует, так это vswprintf (), но я предполагаю, что это тесно связано.

Почему swprintf задыхается от символа Юникод, который находится за пределами 8-битного диапазона?Есть ли способ обойти это?

1 Ответ

5 голосов
/ 21 июня 2010

Попробуйте явно установить локаль в UTF-8.

setlocale(LC_CTYPE, "UTF-8");
...
const wchar_t* test2 = L"D\x2019s";
int ret2 = swprintf(buf2, 100, L"%ls", test2);
...
...