Why conhost.exe Cannot Display Unicode Character U+2717
When attempting to display the Unicode character U+2717 (✗, BALLOT X) in the traditional Windows console (conhost.exe), users encounter a frustrating problem. Even after selecting the system's default monospace font Consolas, the output appears as a question mark enclosed in a box—the universal symbol for an unsupported character. This issue frequently surfaces when using NeoVim and similar terminal-based editors that rely on Nerd Fonts for extended character support. However, even many fonts that claim Nerd Fonts compatibility fail to include this particular glyph.
The root cause is straightforward: Consolas simply does not contain this specific glyph in its character set. The obvious solution would be switching to a font that includes U+2717. After consulting the glyph support listings on fileformat.info, we can confirm that open-source monospace fonts like DejaVu Sans Mono and Inconsolata do indeed include the U+2717 character.
This discovery reveals that conhost does not render text using a single font exclusively. Instead, it employs some form of font fallback mechanism. Following this logic, since Chinese characters successfully fall back to Microsoft YaHei for display, U+2717 should theoretically be able to fall back to a system font that contains it, such as Segoe UI.
Understanding conhost's Font Fallback Mechanism
The conhost console host implements its fallback mechanism through GDI's Font Linking system. The specific configuration resides in the Windows Registry at the following location:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLinkThis registry key contains multiple values, each defining font fallback chains for different base fonts. The SystemLink configuration tells Windows which alternative fonts to consult when the primary font lacks a required glyph.
Microsoft's official documentation on Microsoft Learn, titled "Customize font selection with font fallback and font linking," explains the distinction between two related mechanisms: Font Linking and Uniscribe fallback.
When GDI cannot find a corresponding entry in SystemLink, it additionally queries Uniscribe's built-in fallback table. Chinese characters display correctly precisely because CJK (Chinese, Japanese, Korean) characters have corresponding entries in Uniscribe's built-in fallback table. This ensures that when a font lacks Chinese glyphs, the system automatically substitutes from an appropriate CJK font.
Why U+2717 Falls Through the Cracks
Uniscribe's built-in fallback table performs coarse-grained mapping based on Unicode script blocks. It primarily covers writing systems for various languages: CJK characters, Arabic script, Thai script, and similar language-specific character ranges. These represent the vast majority of text that users encounter in daily computing.
However, U+2717 (✗) belongs to the Dingbats block (Unicode range U+2700–U+27BF). Its Unicode script property is classified as Common (Zyyy), and its general category is So (Other Symbol). This classification means the character doesn't belong to any specific writing system—it's a decorative or symbolic character that transcends language boundaries.
Characters in this category—symbols that don't belong to any particular language's writing system—fall completely outside the coverage scope of Uniscribe's fallback table. The system simply has no instructions for which font to use when these symbols need to be displayed and the primary font lacks them.
Community Requests and Microsoft's Response
Users have submitted requests to Microsoft that are nearly identical to this specific issue. These requests asked for commonly-used Unicode symbols in command-line interfaces to be added to Consolas, including characters like ✔ (checkmark), ✖ (ballot X), ★ (star), ▶ (play triangle), ⚠ (warning sign), and similar symbols. All these characters belong to the same Unicode region as U+2717 and face exactly the same display problem.
In 2021, Microsoft addressed part of this problem through Pull Request #10478, which implemented an architecture-level fix. The change switched conhost's GDI rendering from PolyTextOutW to ExtTextOutW for text output operations.
As miniksa explained in the PR description, the PolyTextOutW code path did not invoke Uniscribe at all, meaning font glyph substitution simply could not occur. In contrast, ExtTextOutW first sends text to Uniscribe for language processing. After Uniscribe completes its analysis, it breaks the rendering call into segments with the ETO_IGNORELANGUAGE flag for final rendering.
The Limitation of the Fix
This architectural fix opened the channel for Uniscribe glyph substitution to function. However, it solved only the question of whether the channel exists—not whether the fallback table contains the necessary entries. U+2717 remains absent from Uniscribe's fallback table. No matter how smooth the channel becomes, if the destination isn't mapped, the substitution cannot succeed.
This situation illustrates a common pattern in software engineering: fixing the mechanism doesn't help if the data driving that mechanism is incomplete. The rendering pipeline now supports font fallback for symbols, but the fallback table itself needs to be populated with appropriate font mappings for the Dingbats and Symbols Unicode blocks.
Practical Workarounds
Until Microsoft updates the Uniscribe fallback table to include these symbols, users have several practical options:
- Use fonts with comprehensive Unicode coverage: Fonts like DejaVu Sans Mono, Inconsolata, or specialized terminal fonts that explicitly include Dingbats and symbol characters.
- Modify the FontLink SystemLink registry: Advanced users can manually add entries to the SystemLink registry key, specifying fallback fonts for symbols. However, this requires careful testing and registry editing skills.
- Use alternative terminal applications: Modern terminal emulators like Windows Terminal use different rendering engines (DirectWrite instead of GDI) that may handle font fallback more comprehensively.
- Accept the limitation: For many users, the occasional missing symbol isn't worth the effort to fix, especially if their primary workflows don't depend on these specific characters.
The fundamental issue remains: Windows console font fallback was designed primarily for language script support, not comprehensive Unicode symbol coverage. Until this design assumption changes, certain symbols will continue to display as missing glyphs in the traditional conhost console.