Поэтому я использую Windows GetGlyphIndiciesW
, чтобы получить индексы глифов для некоторых символьных шрифтов, с которыми я экспериментирую.Эти шрифты обеспечивают сопоставления для символов в области частного использования Unicode (около 0xF000), и, насколько я знаю, это единственные сопоставления, которые у них есть.Тем не менее, GetGlyphIndicesW
всегда, кажется, «добавляет» отображения из других кодов символов, особенно в диапазоне ASCII, в некоторые из глифов.Некоторые примеры кода, использующие шрифт Microsoft «Webdings»:
#include <cstdint>
#include <fstream>
#include <Windows.h>
int main()
{
HDC device_context = CreateCompatibleDC(NULL);
auto font = CreateFont(0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH, L"Webdings");
auto old_font = SelectObject(device_context, font);
std::ofstream file("mappings.txt");
for (WCHAR i = 0; i < 0xF200; ++i) {
WORD index;
GetGlyphIndicesW(device_context, &i, 1, &index, GGI_MARK_NONEXISTING_GLYPHS);
file << "0x" << std::hex << i << ' ';
if (index == 0xFFFFu) {
file << "N/A";
}
else {
file << std::dec << index;
}
file << '\n';
}
SelectObject(device_context, old_font);
DeleteObject(font);
DeleteDC(device_context);
}
, который просто печатает для сохранения каждого символьного кода от 0 до 0xF1FF и его сопоставления глифа, если он существует.
Как и ожидалось, существует непрерывный диапазонот 0xF020 до 0xF0FF сопоставление каждому глифу.Но есть также несколько отображений вокруг 0x2015 (немного странно) и довольно много от 0 до 0xFF.От 0 до 0x1F отображается на глиф 0, затем от 0x20 до 0x7E отображается от 3 до 97, затем разрыв в основном не отображается, а затем от 0xA2 до 0xFF отображается от 132 до 225.
Тем не менее, если смотреть в различных редакторах шрифтов, таких отображений определенно нет.вне 0xF020 до 0xF0FF.И еще более странным является то, что различные различные символьные шрифты, такие как «Symbol» и «Wingdings», и даже некоторые сторонние проприетарные, которые я тестировал, имеют почти точно такие же шаблоны дополнительных сопоставлений, «добавленных» к GetGlyphIndicesW
.
Так что же происходит?