Double-struck and Fraktur are encoded mathematical alphabets
Double-struck letters (often informally called blackboard bold) and Fraktur letters are specialized mathematical letter symbols. A capital letter drawn with double vertical strokes may denote a number set, while Fraktur letters are used in some algebraic and analytic notation. Unicode encodes these mathematical alphabet forms as distinct characters to preserve symbolic distinctions in plain-text interchange. These are not merely font settings: U+0043 C LATIN CAPITAL LETTER C and U+2102 ℂ DOUBLE-STRUCK CAPITAL C are different code points with different names and mathematical uses.
Unicode's general policy prefers ordinary letters with typographic markup for ordinary prose. Mathematical alphanumeric symbols are an exception because the alphabet style may identify a different variable. A double-struck symbol's mathematical meaning is not fixed universally—for example, ℂ conventionally denotes complex numbers, but authors can choose other definitions. Unicode provides the character identity, not a mathematical type system.
Common styled-text generators reuse these alphabets as decoration. That produces copyable Unicode symbols rather than a true custom font. The result may be portable across plain-text fields at the code-point level, but font coverage, normalization and assistive technology determine whether the user experience survives unchanged.
Repertoire and verified code-point examples
The primary ranges sit in the Mathematical Alphanumeric Symbols block, U+1D400..U+1D7FF. Fraktur uppercase A begins at U+1D504; Fraktur lowercase a at U+1D51E. Double-struck uppercase A begins at U+1D538; lowercase a at U+1D552. Bold Fraktur uppercase A begins at U+1D56C. Their uppercase alphabets appear in nearly consecutive mathematical runs, but several characters were already encoded in the BMP and are represented by deliberate holes.
| Character | Code point | Unicode name |
|---|---|---|
𝔄 | U+1D504 | MATHEMATICAL FRAKTUR CAPITAL A |
𝔞 | U+1D51E | MATHEMATICAL FRAKTUR SMALL A |
𝕬 | U+1D56C | MATHEMATICAL BOLD FRAKTUR CAPITAL A |
𝔸 | U+1D538 | MATHEMATICAL DOUBLE-STRUCK CAPITAL A |
𝕒 | U+1D552 | MATHEMATICAL DOUBLE-STRUCK SMALL A |
ℂ | U+2102 | DOUBLE-STRUCK CAPITAL C |
ℌ | U+210C | BLACK-LETTER CAPITAL H |
ℜ | U+211C | BLACK-LETTER CAPITAL R |
𝟘 | U+1D7D8 | MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO |
Double-struck decimal digits form a separate contiguous range beginning at U+1D7D8 for zero and ending at U+1D7E1 for nine. The Fraktur alphabets do not imply a corresponding complete Fraktur digit set. The presence of multiple styled letter alphabets does not justify generating numerals or punctuation by arbitrary Unicode arithmetic.
Not every Fraktur glyph is drawn identically across math fonts. Fonts may vary stroke weight, terminals, and ornaments while targeting the same Unicode scalar. A screenshot showing a Gothic-looking capital letter is not sufficient evidence that its underlying code point belongs to the mathematical Fraktur alphabet.
Legacy black-letter and double-struck symbols
Historically encoded symbols from the BMP Letterlike Symbols block occupy certain positions of these mathematical alphabets. Unicode retained their existing code points; gaps in the supplementary alphabetic ranges avoid introducing duplicate abstract characters. The main historical exceptions relevant to uppercase Fraktur are:
| Fraktur letter | BMP code point | Formal legacy name |
|---|---|---|
| C | U+212D ℭ | BLACK-LETTER CAPITAL C |
| H | U+210C ℌ | BLACK-LETTER CAPITAL H |
| I | U+2111 ℑ | BLACK-LETTER CAPITAL I |
| R | U+211C ℜ | BLACK-LETTER CAPITAL R |
| Z | U+2128 ℨ | BLACK-LETTER CAPITAL Z |
For double-struck uppercase letters, the preexisting BMP exceptions include U+2102 ℂ (C), U+210D ℍ (H), U+2115 ℕ (N), U+2119 ℙ (P), U+211A ℚ (Q), U+211D ℝ (R), and U+2124 ℤ (Z). They are valid, standard members of the mathematical double-struck alphabet, even though they are not in the supplementary block.
Consequently, the algorithm 0x1D538 + (letter - 'A') fails for double-struck C, and 0x1D504 + (letter - 'A') fails for Fraktur C. Some invalid results fall in unassigned holes that a font may render as boxes. Adding a fallback glyph based only on appearance could silently change the letter's identity.
These historical exceptions are further discussed in our mathematical alphanumeric repertoire reference, including how the repertoire differs from a conventional complete font.
Mathematics, historical typography and Unicode intent
In mathematical prose, a double-struck symbol can distinguish a recognized number domain such as ℕ, ℤ, ℚ, ℝ, or ℂ. Fraktur may distinguish Lie algebras, ideals, or other symbolic objects according to the author's convention. Unicode does not mandate these meanings, nor does it require a particular typeface outline for mathematical letterforms.
Historical blackletter fonts have a far wider repertoire of stylistic letters, ligatures and conventions than the mathematical Fraktur alphabet alone. The script used by the author and the font used for the page may be unrelated to which Unicode mathematical character was encoded. A Unicode “Fraktur converter” does not turn English text into a different language, and replacing letters with mathematical Fraktur forms does not preserve historical typesetting conventions of German blackletter documents.
Unicode favors markup or font selection where font-style differences are purely presentational. If a webpage needs a decorative blackletter heading, an accessible solution is typically ordinary letters with a suitable CSS font. If a plain-text message needs to carry the encoded mathematical Fraktur symbol itself, the mathematical character repertoire is applicable—with clear limitations for accessibility and interoperability.
Reliable encoding and decoding strategies
Use an explicit dictionary of known BMP exceptions plus verified continuous runs for the remaining letters, or use a completely explicit 26-character mapping table. Parsing UCD names and compatibility decompositions can help generate and verify the table, but do not infer assignment from numeric proximity alone.
// Narrow uppercase double-struck converter with exceptions.
const doubleStruckBMP = new Map([
["C", 0x2102], ["H", 0x210D], ["N", 0x2115],
["P", 0x2119], ["Q", 0x211A], ["R", 0x211D],
["Z", 0x2124]
]);
function toDoubleStruckUpper(text) {
return [...text].map(ch => {
if (!/^[A-Z]$/.test(ch)) return ch;
const cp = doubleStruckBMP.get(ch) ??
(0x1D538 + ch.codePointAt(0) - 0x41);
return String.fromCodePoint(cp);
}).join("");
}
console.log(toDoubleStruckUpper("CNR"));
// ℂℕℝ
console.log([...toDoubleStruckUpper("AZ")].map(
c => c.codePointAt(0).toString(16).toUpperCase()
));
// ["1D538", "2124"]
This converter intentionally leaves lowercase and punctuation unchanged. A production implementation can add separately validated lowercase and digit maps. For the Fraktur uppercase alphabet, use its five corresponding BMP exceptions; a blind arithmetic mapping is not correct.
Reverse folding is not lossless. Both Fraktur C and double-struck C have a compatibility relation to ordinary C, so converting them back to C discards their original mathematical style and meaning. To round-trip a user-editable design, store the original style selection or the exact original Unicode sequence.
The Fancy Text tool is an appropriate way to inspect the difference between ordinary and copyable mathematical-styled symbols, but correctness should be verified by copying code points—not by treating visually matching typefaces as identical encodings.
Normalization and comparison behavior
NFC/NFD are canonical forms and normally preserve these mathematical letter characters. Compatibility normalization forms, particularly NFKC, map mathematical alphabets to ordinary letters or digits. This is explicitly described in Unicode Standard Annex #15, which warns that compatibility equivalence can erase mathematically significant distinctions.
const examples = ["\u2102", "\u212D", "\u{1D538}", "\u{1D7D8}"];
console.log(examples.map(ch => [
ch.codePointAt(0).toString(16),
ch.normalize("NFKC")
]));
// ["2102","C"], ["212d","C"],
// ["1d538","A"], ["1d7d8","0"]
Even when folded values match, they are not canonically equivalent; their original bytes and code points remain different until a compatibility transform occurs. Normalizing all stored mathematical expressions to NFKC would conflate symbols that were deliberately distinct. For search or identifier validation, consider deriving an auxiliary compatibility-folded key while preserving source text if the semantics require it.
Glyph coverage, accessibility and security
Font fallback remains a practical problem: a general Latin font can lack Fraktur or double-struck glyphs, and math fonts use their own stylistic designs. If the receiving app lacks the relevant glyph, a missing-character box may appear even though the UTF-8 data are valid. No single Unicode code point guarantees a consistent appearance across phones.
Screen readers can identify mathematical styles, announce character names, or provide a reduced reading depending on their implementation and context. In decorative prose, this often makes the text less accessible. Avoid stylized substitutions in important instructions, form labels and long explanations unless an accessible ordinary-text alternative is supplied.
In usernames and security-sensitive identifiers, a double-struck character can look like an ordinary letter while comparing differently at the code-point level. NFKC and confusable mapping are related but distinct mechanisms; a secure identifier policy should use an appropriate Unicode profile and a documented comparison strategy instead of arbitrary string replacement.
Validation cases and developer pitfalls
| Scenario | Expected scalar / behavior | Guard |
|---|---|---|
| Fraktur capital A | U+1D504 | Start of math Fraktur run |
| Fraktur capital C | U+212D | BMP exception, not arithmetic gap |
| Fraktur capital R | U+211C | BMP exception |
| Double-struck capital A | U+1D538 | Supplementary scalar |
| Double-struck capital C | U+2102 | BMP exception |
| Double-struck capital Z | U+2124 | BMP exception |
| Double-struck digit zero | U+1D7D8 | Separate decimal style range |
| NFKC of ℝ | Latin R | Compatibility fold only |
| UTF-16 length of 𝔄 | 2 | Do not split surrogate pairs |
Testing should verify code points, character names, NFKC results and actual pasted data. Test an alphabet's first, last and historical-hole positions; ensure all produced values are assigned and semantically correct. Use official data from the same UCD release. Separately test visual rendering and screen-reader behavior on target platforms.
Primary Unicode and mathematics references
- Unicode Standard Chapter 22 — Letterlike and Mathematical Alphanumeric Symbols.
- Unicode Letterlike Symbols chart, U+2100..U+214F, legacy exceptions.
- Unicode Mathematical Alphanumeric Symbols chart, assigned supplementary symbols and holes.
- UAX #15 — Unicode Normalization Forms, compatibility normalization and mathematical semantic distinctions.
- UAX #44 — Unicode Character Database, names and decompositions.
- UTR #25 — Unicode Support for Mathematics, technical math representation.
Independent Unicode reference; mathematical conventions are contextual and rendering depends on font support.