TextOut (), похоже, не содержит суррогатной пары UNICODE

#winapi #unicode

#winapi #unicode

Вопрос:

Я пытался выставить U 1D400 (суррогатную пару H = 0xD835 L = 0xDC00 ) с помощью TextOut() , но безрезультатно. Почему?

случай WM_PAINT:

     PAINTSTRUCT ps;

    BeginPaint(hwnd, amp;ps);

    int iLogPixelsY;

    iLogPixelsY = GetDeviceCaps(ps.hdc, LOGPIXELSY);

    LOGFONT lf;

    int iPts;

    iPts = 11;

    memset(amp;lf, 0, sizeof(LOGFONT));
    lf.lfHeight = -iPts * iLogPixelsY / 72;
    lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
    wcscpy_s(lf.lfFaceName, L"Cambria Math");

    HFONT hFont;

    hFont = CreateFontIndirect(amp;lf);
    hFont = (HFONT)SelectObject(ps.hdc, hFont);

    wchar_t tx[2];

    tx[0] = 0xD835;
    tx[1] = 0xDC00;

    TextOut(ps.hdc, 10, 100, tx, 1); 

    DeleteObject(SelectObject(ps.hdc, hFont));

    EndPaint(hwnd, amp;ps);
    break;
  

Комментарии:

1. У вас есть шрифты, необходимые для этого символа?

2. На моем компьютере установлен шрифт Cambria Math. Я постоянно использую редактор уравнений Word.

Ответ №1:

Вы вызываете TextOut, указывая длину строки 1, но согласно этой документации, вы должны передать 2, поскольку это суррогатная пара.

Комментарии:

1. это правильно. Вы передаете количество символов, а не количество кодовых точек.

2. @David: укажите количество слов, а не количество символов (это один символ, определяемый с помощью двух слов).

3. Нет, это действительно персонажи. Суррогатная пара из двух символов составляет единую кодовую точку. Терминология Microsoft просто неправильная!

4. Я могу понять, почему они пишут это таким образом, потому что термин character настолько загружен разными значениями.

5. Я использовал TextOut (ps.hdc, 10, 100, tx, 2); и это не сработало. Напечатаны два вопросительных знака (недопустимый глиф).