User Rating 0.0
Total Usage 0 times
0 / 5000
Combining Marks
Selected: 0
Base chars: 0 Marks added: 0 Total length: 0
Is this tool helpful?

Your feedback helps us improve.

About

Unicode combining characters (range U+0300 - U+036F) are non-spacing marks that attach to the preceding base character without advancing the cursor. Incorrect usage produces mojibake or corrupted displays across mail clients, databases with improper normalization, and legacy systems that strip or misinterpret multi-byte sequences. This tool inserts one or more combining diacritical marks after each base character in your input, generating real Unicode output - not images or SVG hacks. It handles stacking order, avoids double-application on existing combining marks, and respects the 5000-character safety limit to prevent browser rendering stalls from excessive mark accumulation.

Common applications include linguistic annotation (IPA transcription requires precise mark placement), mathematical notation where combining overlines (U+0305) denote repeating decimals, and creative “Zalgo” text effects that stack multiple marks vertically. The tool distinguishes between above, below, overlay, and enclosing mark categories so you can control vertical placement. Pro tip: some fonts render stacked marks poorly - test output in your target application before publishing.

combining characters unicode diacritical marks zalgo text text effects unicode combining text decorator

Formulas

The combining character insertion algorithm processes each character in the input string and classifies it by Unicode code point. For a given input string S of length n and a set of selected combining marks M, the output string O is constructed as follows:

for each ci in S:
append ci to O
IF isCombining(ci) = FALSE:
for each mj in M:
repeat mj × k times, append to O

Where k is the stacking intensity (1 - 10). The function isCombining(c) returns TRUE when the code point falls within U+0300 - U+036F, U+1AB0 - U+1AFF, U+1DC0 - U+1DFF, U+20D0 - U+20FF, or U+FE20 - U+FE2F. This check prevents combining marks from receiving additional marks, avoiding uncontrolled recursive stacking. Output length is bounded by n × (1 + |M| × k).

Reference Data

CharacterUnicodeNamePositionExample (on 'a')
̀U+0300Combining Grave AccentAbove
́U+0301Combining Acute AccentAbove
̂U+0302Combining Circumflex AccentAbove
̃U+0303Combining TildeAbove
̄U+0304Combining MacronAbove
̅U+0305Combining OverlineAbove
̆U+0306Combining BreveAbove
̇U+0307Combining Dot AboveAbove
̈U+0308Combining DiaeresisAbove
̊U+030ACombining Ring AboveAbove
̋U+030BCombining Double AcuteAbove
̌U+030CCombining CaronAbove
̐U+0310Combining CandrabinduAbove
̒U+0312Combining Turned Comma AboveAbove
̓U+0313Combining Comma AboveAbove
̔U+0314Combining Reversed Comma AboveAbove
̖U+0316Combining Grave BelowBelow
̗U+0317Combining Acute BelowBelow
̣U+0323Combining Dot BelowBelow
̤U+0324Combining Diaeresis BelowBelow
̥U+0325Combining Ring BelowBelow
̦U+0326Combining Comma BelowBelow
̧U+0327Combining CedillaBelow
̨U+0328Combining OgonekBelow
̭U+032DCombining Circumflex BelowBelow
̮U+032ECombining Breve BelowBelow
̰U+0330Combining Tilde BelowBelow
̱U+0331Combining Macron BelowBelow
̲U+0332Combining Low LineBelow
̳U+0333Combining Double Low LineBelow
̴U+0334Combining Tilde OverlayOverlay
̵U+0335Combining Short Stroke OverlayOverlay
̶U+0336Combining Long Stroke OverlayOverlay
̷U+0337Combining Short Solidus OverlayOverlay
̸U+0338Combining Long Solidus OverlayOverlay
U+20DDCombining Enclosing CircleEnclosinga⃝
U+20DECombining Enclosing SquareEnclosinga⃞
U+20DFCombining Enclosing DiamondEnclosinga⃟
U+20E0Combining Enclosing Circle BackslashEnclosinga⃠

Frequently Asked Questions

Combining character rendering depends on the font's OpenType GPOS/GDEF tables and the text shaping engine (HarfBuzz, DirectWrite, CoreText). If a font lacks anchor points for a specific combining mark, the mark will appear misaligned or overlap adjacent glyphs. Monospace fonts and system fallback fonts handle stacking particularly poorly. Test your output in the target application with the intended font before deployment.
A precomposed character like "é" (U+00E9) is a single code point. The equivalent combining sequence is "e" + U+0301 (two code points). Unicode Normalization Form C (NFC) converts combining sequences to precomposed equivalents where they exist. Form D (NFD) does the reverse. This tool always outputs combining sequences (NFD-style), which may be normalized by downstream systems. If your output appears to lose marks, check whether the receiving system applies NFC normalization.
The Unicode standard imposes no hard limit on combining character sequences. However, the Unicode Consortium recommends a Stream-Safe Text Format limit of 30 trailing non-starters. In practice, browsers begin to exhibit rendering artifacts (clipping, overflow into adjacent lines) at around 10-15 stacked marks depending on the font and mark category. This tool caps stacking intensity at 10 repetitions per mark to balance visual effect with rendering stability.
Yes. In JavaScript, Python 3, and most languages, string length counts code units or code points, not grapheme clusters. The string "a" + U+0301 has length 2 in JavaScript despite appearing as one visible character. Use the Intl.Segmenter API or a grapheme cluster library when you need to count user-perceived characters. Database VARCHAR columns may also truncate mid-sequence, corrupting the output.
Absolutely. The string "café" can be encoded two ways: with precomposed "é" (U+00E9) or as "e" + U+0301. These are canonically equivalent but not byte-equal. A naive string comparison (=== in JavaScript) returns false. Always normalize strings with NFC or NFD before comparison. SQL databases vary: PostgreSQL respects Unicode equivalence with the "und-x-icu" collation, while MySQL's utf8mb4_general_ci does not distinguish combining sequences from precomposed forms.
Zalgo text stacks numerous combining marks (above, below, and overlay) on each base character to create a visual "glitch" or "corrupted" appearance. It exploits the fact that browsers attempt to render all combining marks even when they overflow the line height. Typically 5-15 randomly selected marks from each positional category are applied per base character. This tool provides controlled Zalgo generation through the stacking intensity slider and category filters, giving precise control over the effect density.