Remove soft hyphens
Strip the 3 invisible break marks hidden in the sample sentence copied from a PDF, and hyphenation, international and cooperation become whole words again. Real hyphens and dashes stay exactly where they are. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Soft hyphens are invisible Unicode characters that word processors, typesetting engines, and PDF exporters insert so a long word can break cleanly at the end of a justified line. When you copy that text into a search box, a CMS, a spreadsheet, or a code editor, the optional break stays in the string. Words that looked whole on the page suddenly fail exact-match lookups, split in the middle of a URL, or show a hyphen that appears and disappears depending on the font and the wrap. This tool walks your text, removes every U+00AD soft hyphen and the common HTML encodings that represent the same character, and returns a cleaned string plus a count of what was stripped. Regular hyphens, dashes, and spaces stay put. Empty input is rejected with a clear validation error so clients notice missing fields.
What a soft hyphen is and why copied words split
A soft hyphen is not the hyphen you type between well-known or twenty-one. It is Unicode character U+00AD, also called SOFT HYPHEN, and in HTML source it appears as the named entity ­ or as the numeric references ­ and ­. Typesetting systems insert it as an optional line-break opportunity: if the word fits on the current line the character stays invisible, and if the word must wrap the renderer may draw a hyphen at that point.
PDF exporters, InDesign stories, Word documents with hyphenation turned on, and many news CMS templates sprinkle these marks through long words so justified columns look even. The trouble starts when a human or a scraper copies the rendered text. The optional mark travels with the letters.
Downstream, a search for international misses inter plus U+00AD plus national, a unique constraint treats two visually identical titles as different rows, and a URL built from the string contains a character that some browsers and some CDNs handle differently. This capability removes only that optional mark. It does not delete hyphen-minus, the non-breaking hyphen, en dashes, em dashes, or hyphenation-point glyphs, and it does not rejoin a word that a PDF broke with a real hyphen plus a newline.
Those are different search intents.
What you send and what you get back
Send a single required field named text containing the non-empty string you want to clean. Numbers and booleans are coerced to their decimal or true-false text forms; objects, arrays, NaN, and Infinity are rejected. Removal covers the raw U+00AD code point and the HTML encodings ­, ­, and ­ (hex digits are case-insensitive; leading zeros are allowed).
Classic checks include hyphenation with three embedded marks becoming a single word, mixed HTML entities next to a kept well-known hyphen, and a string of only soft hyphens collapsing to an empty result after a non-empty original. Wire the free browser form for quick paste-and-copy work, then call the identical contract from scripts when you normalize CMS fields, PDF extracts, or CSV columns.
Where a remove-soft-hyphens tool earns its keep
Editorial and localization teams clean PDF and InDesign exports before the copy lands in a CMS, so search, slug generation, and translation memory see whole words instead of silently split tokens. Data engineers running warehouse loads and CRM imports strip soft hyphens from free-text columns before exact joins, uniqueness checks, and full-text indexes, because an invisible U+00AD is enough to turn a perfect match into a miss.
Legal and compliance groups preparing filings, contracts, and redlines often receive justified Word or PDF text whose hyphenation marks survive into comparison tools and produce noisy diffs. Product search and autocomplete pipelines normalize query strings and stored titles so a shopper who types cooperation matches a catalog entry that arrived as co plus soft hyphen plus operation from a supplier feed. If you later need variation-selector removal, zero-width character cleanup, accent stripping, or full Unicode normalization, treat those as separate search intents and landings rather than overloading this remove-soft-hyphens page.
What you can do with it
Clean PDF and justified copy-paste
Paste text copied from a PDF, Word file, or news CMS and rejoin words that split because of invisible U+00AD marks.
Normalize CMS fields and CSV columns
Strip soft hyphens from titles, bodies, and imports so search, unique keys, and translation memory match whole words.
FAQ
What does remove soft hyphens do?
It strips invisible Unicode soft hyphens (U+00AD) and the HTML encodings ­, ­, and ­ from your text, then returns the cleaned string plus a removed count. Regular hyphens and dashes stay.
What happens if I send empty text?
Empty strings are rejected so clients notice missing fields instead of receiving a silent empty result.
Does it remove ordinary hyphens or dashes?
No. Hyphen-minus, non-breaking hyphens, en dashes, and em dashes are left unchanged. Only the invisible soft hyphen and its HTML encodings are removed.
Will already-clean text change?
No. If there are no soft hyphens, result equals the original text, changed is false, and removed is zero.
What does it cost?
The browser tool is free and runs locally.
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/str/remove-soft-hyphens \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"The hyphenation of international cooperation."}'const res = await fetch("https://api.kit.forhosting.com/str/remove-soft-hyphens", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "The hyphenation of international cooperation."
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/remove-soft-hyphens",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "The hyphenation of international cooperation."
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/remove-soft-hyphens", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"The hyphenation of international cooperation."}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"The hyphenation of international cooperation."}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/remove-soft-hyphens", 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": "The hyphenation of international cooperation."
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.remove_soft_hyphens",
"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 a soft hyphen is and why copied words split
The walk is deterministic: the same string always yields the same JSON, with no locale table, no network call, and no random sampling.
What you send and what you get back
Aliases such as input, value, data, s, message, string, content, and body are accepted when wiring older clients. Empty strings fail with invalid_input before any scan, and payloads longer than the documented character cap also fail so one request cannot monopolize Worker memory. On success the response echoes the original text, the cleaned result, the result length, the original length, a boolean changed flag, removed as the count of soft hyphens stripped, and operation set to remove_soft_hyphens. Pricing for successful API calls is the published base of $0.002 per item; validation failures including empty text do not consume prepaid balance.
Where a remove-soft-hyphens tool earns its keep
Because this capability is a pure parse engine, API pricing is the published base of $0.002 per successful item and failed validation does not consume balance.
Integration use cases
Stable tests and scrape pipelines
Make fixtures and extracted strings independent of typesetter hyphenation so goldens and scrapers stay deterministic.