#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); и это не сработало. Напечатаны два вопросительных знака (недопустимый глиф).