Winapi TextOut()不';t似乎显示了一个代理UNICODE对

Winapi TextOut()不';t似乎显示了一个代理UNICODE对,winapi,unicode,Winapi,Unicode,我尝试使用TextOut()来展示U+1D400(代理项对H=0xD835L=0xDC00),但没有成功。为什么? 案例WM_油漆: 您正在调用TextOut,指定字符串长度为1,但根据,您应该通过2,因为它是一个代理项对。您有该字符所需的字体吗?Cambria Math字体已安装在我的计算机上。我一直在用公式编辑器这个词,没错。您传递的是字符数而不是代码点数。@大卫:传递的是字数而不是字符数(一个字符,用两个单词定义)。不,它实际上是字符数。由两个字符组成的代理项对构成一个代码点。微软的术语是

我尝试使用
TextOut()
来展示U+1D400(代理项对
H=0xD835
L=0xDC00
),但没有成功。为什么?

案例WM_油漆:


您正在调用TextOut,指定字符串长度为1,但根据,您应该通过2,因为它是一个代理项对。

您有该字符所需的字体吗?Cambria Math字体已安装在我的计算机上。我一直在用公式编辑器这个词,没错。您传递的是字符数而不是代码点数。@大卫:传递的是字数而不是字符数(一个字符,用两个单词定义)。不,它实际上是字符数。由两个字符组成的代理项对构成一个代码点。微软的术语是错误的!我可以理解为什么他们会这样写,因为字符这个词有着不同的含义;但它不起作用。打印两个问号(无效图示符)。
    PAINTSTRUCT ps;

    BeginPaint(hwnd, &ps);

    int iLogPixelsY;

    iLogPixelsY = GetDeviceCaps(ps.hdc, LOGPIXELSY);

    LOGFONT lf;

    int iPts;

    iPts = 11;

    memset(&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(&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, &ps);
    break;