【问题标题】:TextOut() doesn't seem to exhibit a surrogate UNICODE pairTextOut() 似乎没有表现出代理 UNICODE 对
【发布时间】:2011-08-15 21:09:18
【问题描述】:

我尝试使用 TextOut() 展示 U+1D400(代理对 H = 0xD835 L = 0xDC00)无济于事。为什么 ?

案例 WM_PAINT:

    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;

【问题讨论】:

  • 你有那个字符需要的字体吗?
  • Cambria Math 字体安装在我的机器上。我一直在使用 Word Equation Editor。

标签: winapi unicode


【解决方案1】:

您正在调用 TextOut,指定字符串长度为 1,但根据 this documentation,您应该传递 2,因为它是代理对。

【讨论】:

  • 这是对的。您传递的是字符数而不是代码点数。
  • @David:传递字数而不是字符数(这是一个字符,用两个字定义)。
  • 不,它真的是字符。两个字符的代理对组成一个代码点。微软的术语是错误的!
  • 我可以理解他们为什么这样写,因为这个词字符充满了不同的含义。
  • 我使用了 TextOut(ps.hdc, 10, 100, tx, 2);它没有用。打印了两个问号(无效字形)。
猜你喜欢
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多