{
  "id": 3888982,
  "title": "Unicode's bold alphabet has holes in it, and every text generator falls in",
  "url": "https://urgent.news/2026/08/28/unicodes-bold-alphabet-has-holes-in-it-and-every-text-generator-falls",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-08-28T04:13:52.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/support_confileo_ce7442eb/unicodes-bold-alphabet-has-holes-in-it-and-every-text-generator-falls-in-1d8j"
  },
  "original_language": "en",
  "account": "Unicode's bold alphabet has gaps, and every text generator falls short. When building fancy text generators for Instagram bios and Discord names, developers write a function that converts regular letters to their bold counterparts. The function works for basic text like \"Hello World\" and converts it to 𝐇𝐞𝐥𝐥𝐨 𝐖𝐨𝐫𝐥𝐝. However, it fails when someone types their name in cursive, resulting in blank squares ☐. The issue lies with the Mathematical Alphanumeric Symbols block, which contains about a dozen styled Latin alphabets, including bold, italic, bold italic, script, bold script, fraktur, double-struck, sans-serif, monospace, and digit sets. The block appears clean, with 26-letter runs, but it is not. Some letters already existed in the Letterlike Symbols block, so Unicode left those slots permanent. Five alphabets have gaps, including script B, E, F, H, I, L, M, R; fraktur C, H, I, R, Z; double-struck C, H, N, P, Q, R, Z; and italic (serif) h. These gaps cause problems when converting text, as the arithmetic falls into the empty spaces, resulting in blank squares instead of the intended characters. The solution is not cleverness but a lookup table, consulting an explicit exception table before the arithmetic. The test pangram checks for reserved codepoints, revealing the gaps that cause the tofu output in certain letters. There is no formula to fix the issue, only an explicit exception table to ensure the correct implementation.",
  "summary": "If you have ever built a \"fancy text\" generator — the things people paste into Instagram bios and Discord names — you have written this function: // Looks right. Is wrong. const toBold = text => text . replace ( / [ A-Za-z ] /g , ch => { const c = ch . charCodeAt ( 0 ); return c <= 90 ? String . fromCodePoint ( 0x1D400 + ( c - 65 )) // A-Z : String . fromCodePoint ( 0x1D41A + ( c - 97 )); // a-z…",
  "key_points": [
    "Unicode's bold alphabet has gaps in certain letters",
    "Text generators fail when converting cursive names",
    "Explicit exception table needed to resolve gaps"
  ],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}