Unicode subscript text
Type H2O C6H12O6 x1 and get H₂O C₆H₁₂O₆ ₓ₁: digits, plus, minus, equals, brackets and the lowercase letters Unicode supports drop below the line, ready to paste into lab notes, slides or a chat. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Text
- H2O C6H12O6 x1
- Calculation mode
- Encode
- Result
- H₂O C₆H₁₂O₆ ₓ₁
- Length
- 14
- Mapped
- 7
- Unmapped
- H, O, , C
Unicode subscript text turns ordinary digits and a practical set of Latin letters into the small below-the-baseline characters that chemical formulas and math indices need when a host only accepts a single plain string. Writers paste H₂O, CO₂, C₆H₁₂O₆, or x₁, aₙ, and k₍ₙ₎ into lab notes, textbooks, product labels, chat messages, and markdown-free bio fields without installing fonts or shipping MathML. This converter maps digits zero through nine, the Latin letters that Unicode defines as subscripts, and the operators plus, minus, equals, and parentheses to those code points, restores subscript characters back to plain Latin and digits, and reports every character that could not be mapped so you know what stayed ordinary. Spaces, punctuation outside the operator set, emoji, and unsupported letters pass through unchanged and appear in the unmapped list. Encode, decode, or auto-detect direction without network calls, random salts, or date-dependent shortcuts.
What Unicode subscripts are and what this tool returns
Unicode subscript digits live in the Superscripts and Subscripts block: digit zero is U+2080 and digit nine is U+2089, with plus, minus, equals, and parentheses nearby as U+208A through U+208E. A smaller set of Latin subscript letters is scattered across that block and related phonetic extensions—for example subscript a at U+2090, e at U+2091, h at U+2095, i at U+1D62, n at U+2099, and x at U+2093—because the standard never shipped a full A–Z small-caps alphabet under the baseline.
Those characters render as true subscripts in most modern fonts, which is why chemists paste H₂O and C₆H₁₂O₆ into plain text, teachers write x₁ and aₙ in slides without MathML, and product teams store formula-looking titles when a CMS strips rich markup. This capability implements a fixed, reversible table: each plain digit becomes exactly one subscript digit, each supported lowercase Latin letter becomes its small subscript form, each supported operator becomes its subscript twin, and each recognized subscript character becomes exactly one plain digit, lowercase letter, or operator.
Uppercase letters pass through unchanged so chemical element symbols stay ordinary while digits drop below the baseline. There is no keyword stream, no random salt, and no optional font file that could drift between locales. Spaces, unsupported letters such as b or c, emoji, and non-Latin scripts are never invented into look-alike glyphs; they pass through and are listed so you can see exactly what stayed ordinary.
If you need full MathML, LaTeX, or real typographic baseline shift with every letter of the alphabet, use a rich math editor instead. This landing answers only the plain-to-Unicode-subscript contract that formula and index generators already describe when they advertise chemical and math subscript text.
Where subscript Unicode fits for formulas, indices, and automation
Chemists and science educators use Unicode subscripts when a lab note, syllabus line, or product label must show H₂O, CO₂, or C₆H₁₂O₆ without relying on HTML sub tags or app-specific markup. Math teachers and textbook teams write x₁, aₙ, and parenthesized indices for sequences when a platform only accepts a single plain string. Frontend teams can show encode and decode side by side so designers preview how a formula-looking title will look after paste into platforms that strip rich text.
Backend services precompute styled catalog names, quiz stems, or newsletter subject experiments where the subscript string must be stored as plain Unicode rather than as HTML. Quality engineers generate deterministic encode and decode pairs for contract tests so a middleware that claims formula support cannot silently switch to fullwidth digits, superscript tables, or font hacks. Search and support tooling can strip subscript decoration back to searchable plain text when tickets contain decorative formula IDs or chemistry-styled SKUs.
Pair it with other classical and Unicode text helpers when you are building a small lab of free, deterministic string tools, and never treat decorative subscript code points as a substitute for real MathML, accessibility labels, or semantic chemical markup when those options are available.
What you can do with it
Chemical formulas in plain text
Style H2O, CO2, and C6H12O6 as H₂O, CO₂, and C₆H₁₂O₆ for lab notes, labels, and CMS fields that only accept a single plain string.
Math indices and sequences
Write x1, an, and parenthesized indices as x₁, aₙ, and k₍ₙ₎ for slides, quizzes, and chat where MathML is not available.
Decode and search recovery
Restore subscript formulas and indices to plain digits and letters for uniqueness checks, search indexes, and support ticket triage.
FAQ
How do I convert plain text to Unicode subscripts?
Send a non-empty string in text with mode encode (the default). Digits 0–9, supported lowercase Latin letters, and the operators + - = ( ) become the matching Unicode subscript characters; uppercase letters and other characters pass through and appear in unmapped.
How do I convert subscript Unicode back to plain text?
Send the subscript string with mode decode, or use mode auto when the input already contains recognized subscript characters. Mapped subscripts become plain digits, lowercase letters, or operators.
What characters are reported as unmapped?
Any code point that is not in the encode or decode table—unsupported letters such as b or c, spaces, most punctuation, emoji, and other scripts. The response lists unique unmapped characters and their position count.
Why are some letters missing as subscripts?
Unicode only defines a partial Latin subscript set (for example a, e, h, i, j, k, l, m, n, o, p, r, s, t, u, v, x). Letters without an official subscript form pass through unchanged and are listed as unmapped rather than approximated.
Why do capital letters stay the same size?
On purpose: uppercase letters pass through unchanged so element symbols such as H, O and C stay ordinary while only the digits drop. That is how H2O becomes H₂O instead of a fully shrunken word.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/enc/subscript-unicode \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"H2O C6H12O6 x1"}'const res = await fetch("https://api.kit.forhosting.com/enc/subscript-unicode", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "H2O C6H12O6 x1"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/subscript-unicode",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "H2O C6H12O6 x1"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/subscript-unicode", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"H2O C6H12O6 x1"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"H2O C6H12O6 x1"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/subscript-unicode", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"text": "H2O C6H12O6 x1"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.subscript_unicode",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
What Unicode subscripts are and what this tool returns
The JSON response always includes the original text, the converted result, the resolved mode (encode or decode), the result length in Unicode code points, how many characters were mapped, the unique unmapped characters in first-seen order, the unmapped count, and short metadata naming the alphabet, script, and Unicode blocks.
How text and mode are read and how unmapped characters are reported
Encode walks every Unicode code point, replaces digits 0–9, supported lowercase Latin letters, and the operators plus, minus, equals, and parentheses with the matching subscript character, and leaves every other character as-is while recording it in the unmapped report. Uppercase letters intentionally pass through so chemical formulas keep element symbols: H2O becomes H₂O and C6H12O6 becomes C₆H₁₂O₆ rather than fully subscripted glyphs. Decode does the reverse: subscript digits, letters, and operators become plain digits, lowercase Latin, or ASCII operators, and everything else passes through as unmapped. Mapped counts only the characters that actually changed direction. The preferred payload fields are text for the message and optional mode for encode, decode, or auto. Text accepts aliases such as input, value, s, message, plaintext, styled, body, and formula so forms and SDK clients can reuse existing column names. Mode defaults to encode when omitted and also accepts short aliases such as enc, e, sub, subscript, style for encode, dec, d, plain, unstyle for decode, and detect or either for auto. Any other mode string fails validation with invalid_input. Auto inspects the input once: if any recognized subscript character is present, the request runs as decode; otherwise it runs as encode. Empty text, missing text, non-string object values, and oversized payloads above the character limit raise invalid_input and are not billed. The unmapped array is ordered by first appearance and de-duplicated so a string with many spaces reports space once while unmapped_count still reflects every unmapped position. Pair the free browser run on this page with the priced API when you need the identical mathematical result inside an automated pipeline at $0.002 per successful call.
Where subscript Unicode fits for formulas, indices, and automation
On this page the work runs entirely in your browser; through the API each successful conversion costs $0.002, failed validation is not charged, and nothing is stored after the response returns. That split—free interactive exploration and a priced, identical API—matches the rest of the KIT tier-A catalog and lets you move from a design mockup to an automated pipeline without changing the transformed result.
Technical questions
What does the Unicode subscript converter cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.