Style Text · browser-local

Underline Text Generator

Underline plain text where there is no rich-text option by adding the combining low line (U+0332) after each supported character. The underline travels with the text when you copy it, unlike an editor's underline button. GlyphSift keeps characters it should not stack a mark on, such as emoji.

Index state
draft
Reviewed
2026-09-16
Input limit
5,000 graphemes
19 graphemes19 code points19 bytes
Live result

Underline Text Generator

U̲n̲d̲e̲r̲l̲i̲n̲e̲ t̲h̲i̲s̲ t̲e̲x̲t̲

100% converted0 unsupported

Good fit

Use this tool when

  • A field has no underline button but accepts pasted text.
  • You want the underline to survive copy and paste.
  • Your text is mostly Latin letters and digits.

Keep the original

Avoid it when

  • You control an editor that already offers real underline.
  • The destination must stay accessible and easy to search.
  • Fonts at the destination break combining marks into separate boxes.
01

Reviewed truth vectors

Examples that expose the edge cases

InputAB
OutputA̲B̲

Each letter is followed by the combining low line U+0332.

InputHello 42
OutputH̲e̲l̲l̲o̲ 4̲2̲

Letters and digits are underlined; the space is left plain.

InputCafé 😀
OutputC̲a̲f̲é 😀

The precomposed é and the emoji are preserved without a stacked mark.

02

Transparent implementation

How it works

  1. 01

    Split the input into Unicode code points.

  2. 02

    Append the combining low line (U+0332) after each letter and digit.

  3. 03

    Skip spaces, emoji, and lone combining marks so nothing renders as a broken stack.

03

Known limitations

What the result cannot promise

The underline is a combining character, not a font style, so some fonts draw it broken or offset.

Precomposed accented letters and emoji are left without an added mark.

Combining marks can reduce searchability and be read out oddly by assistive technology.

04

Questions before copying

Frequently asked questions

Why does the underline look broken in some apps?

The combining low line is drawn by the destination font. When gaps appear between characters, the font is not joining the marks; the underlying text is still correct. See the guide on why copied underlines look different.

Is this the same as pressing the underline button?

No. An editor's underline is formatting that is lost in plain-text fields. This adds combining characters to the text so the underline is copied with it.

Why is my emoji not underlined?

Stacking a combining line on emoji and other complex characters usually renders as a broken box, so GlyphSift leaves them unchanged.

05

Experience, expertise & trust

How we verify this tool

GlyphSift Editorial — Text-engine authors & reviewers

The GlyphSift Editorial team designs the deterministic text engine, writes each tool's examples against real Unicode edge cases, and reviews every claim before a page becomes eligible for indexing. We build and test the software we document; we do not outsource the copy to generic content mills.

Each tool page is reviewed against the same six input classes the engine is tested with — ASCII, emoji, combining marks, non-Latin scripts, empty input, and 5,000-grapheme input — and cannot become eligible if it is only a parameter variation of another page.

Automated evidence

  • Tool-contract & coverage suite30 deterministic cases

    tests/tools-30.test.mjs mirrors the ToolRunner dispatch and asserts every registered engineId returns the contracted output shape, plus a coverage guard so no tool silently drops characters.

    Run in: node --test after a production build (vinext build)
  • Rendered-HTML suite12 deterministic cases

    tests/rendered-html.test.mjs renders the deployed server bundle and asserts the Unicode-version manifest and each wave's tool markup are present in the server-rendered HTML.

    Run in: node --test against the built dist/server bundle
  • Transform & cleanup suite21 deterministic cases

    tests/transform-cleanup.test.mjs exercises each deterministic cleanup and transform action against whitespace, duplicate, ordering, casing, and HTML-to-text edge cases.

    Run in: node --test, no network, no randomness

Standards this tool follows