Transform text with 20+ conversion options

Case Converter

Convert text between various cases and formats. Support for file uploads, URL fetching, and comprehensive text transformations.

Editor:PlainRich
Output:In-PlacePreview
Chars: 0Words: 0Sentences: 0Lines: 0
Editor:PlainRich
Output:In-PlacePreview
Chars: 0Words: 0Sentences: 0Lines: 0

Case Converter — Frequently Asked Questions

The tool ships exactly 20 transformations as one grid of buttons, and each applies on click — no dropdown, no submit. Nine deal purely with capitalization: Sentence case, lower case, UPPER CASE, Capitalized Case, aLtErNaTiNg cAsE, Title Case, InVeRsE CaSe, tOGGLE cASE and Random Case. Five produce programming identifiers: camelCase, PascalCase, snake_case, dot.case and Slugify-text. Two — H-y-p-h-e-n and U_n_d_e_r_s_c_o_r_e — discard whitespace entirely and put a separator between every remaining character. Three normalize whitespace and one reverses the string. Hovering a button shows its description. Two behaviours to expect: Random Case calls Math.random per character, so the same input gives a different result on every click, and there is no undo anywhere, which makes Preview the safe way to try several formats against one source.

Capitalization

Sentence case, lower case, UPPER CASE, Capitalized Case, aLtErNaTiNg cAsE, Title Case, InVeRsE CaSe, tOGGLE cASE, Random Case

Identifiers

camelCase, PascalCase, snake_case, dot.case, Slugify-text (also the kebab-case output)

Character delimiters

H-y-p-h-e-n and U_n_d_e_r_s_c_o_r_e drop whitespace, then separate every remaining character

Whitespace and order

Remove Extra Spaces, Remove All Spaces, Remove Line Breaks, Reverse Text

Most case converters aimed at writers stop at upper, lower, title and sentence. The five identifier transforms are why a developer opens this page, and their behaviour is worth knowing before you paste a variable list. snake_case and dot.case split on the lowercase-to-uppercase boundary via /([a-z])([A-Z])/g, so getUserByID becomes get_user_by_id and get.user.by.id. camelCase and PascalCase work the opposite way: they lowercase everything first, then uppercase the character after each run of non-alphanumerics. That flattens acronyms — "parse XML file" becomes parseXmlFile — and leaves separator-free input untouched, so XMLHttpRequest becomes xmlhttprequest. Give those two space-, hyphen- or underscore-delimited words. Slugify-text strips non-ASCII instead of transliterating, so Café becomes caf and Cyrillic or CJK input vanishes.

Every transformation is a synchronous JavaScript string operation running in your tab. Files you load are read with FileReader.readAsText; files you export are assembled from a Blob and URL.createObjectURL and handed to a temporary anchor element; clipboard writes go through navigator.clipboard.writeText. None of those paths sends your text anywhere, and there is no account, no session and no server-side processing to opt out of. The single deliberate network call is the optional URL box, which fetches the address you type directly from your browser and is therefore constrained by that origin's CORS headers — leave it empty and nothing leaves the page. That matters when your input is a customer list, an internal log excerpt or unreleased copy.

Text enters four ways: typing, pasting, a local file, or a URL fetch. The picker accepts .txt, .html, .csv, .json, .md, .xml and .log and rejects everything else with an error toast. A single toggle controls output: In-Place rewrites the editor, Preview writes to a read-only pane carrying its own counts, its own Find & Replace and its own export controls. Copy offers Plain Text, JSON Object, CSV and JavaScript Array; download offers .txt, .csv, .json and .xml, named case-converted-YYYY-MM-DD, or case-preview-YYYY-MM-DD from the preview pane. The two selectors sync: pick CSV to copy and the download flips to .csv, while JavaScript Array or XML sends the other side back to plain text. No writer escapes delimiters, so keep plain text for content with commas, quotes or angle brackets.

The four counters update on every keystroke for both panes. Characters is String.length, so it includes spaces and counts an astral-plane emoji as two UTF-16 units. Words splits the trimmed text on whitespace. Sentences matches /[^.!?]+[.!?]+/g, so an unterminated final fragment is never counted — worth knowing before you trust the number in a word-count workflow. Lines splits on CRLF, CR or LF, and a trailing newline adds one. The limits, stated plainly: no undo history; no keyboard shortcut bound to any transform, since Enter in the URL box is the only key binding; no regex or whole-word option in Find & Replace; no style-guide selector for Title Case; and no chunked file reader, because the whole file becomes a single React state string, so multi-megabyte logs lag the editor.

No. Every one of the 20 transformations is a plain JavaScript string operation running on your browser's main thread. Files are read locally with FileReader.readAsText, downloads are built from a Blob and URL.createObjectURL, and copying uses navigator.clipboard.writeText — none of those paths sends text to DevDrills. The one exception is the optional URL box: typing a URL makes your browser fetch that address directly, subject to the target site's CORS policy. Leave it empty and no network request touches your content. There is no account, no login and no server-side processing to opt out of.

Exactly 20, each its own button: Sentence case, lower case, UPPER CASE, Capitalized Case, aLtErNaTiNg cAsE, Title Case, InVeRsE CaSe, tOGGLE cASE, Random Case, camelCase, PascalCase, snake_case, dot.case, Slugify-text, H-y-p-h-e-n, U_n_d_e_r_s_c_o_r_e, Reverse Text, Remove Extra Spaces, Remove All Spaces and Remove Line Breaks. Nine change capitalization only, five produce programming identifiers, two drop whitespace and put a hyphen or underscore between every remaining character, three normalize whitespace, and one reverses the string. Random Case calls Math.random per character, so clicking it twice on the same text gives different output.

It lowercases the whole string first, then uppercases the character following each run of non-alphanumeric characters. So "parse XML file" becomes "parseXmlFile", not "parseXMLFile" — acronym casing is deliberately flattened. Because the split is driven entirely by separators, an input that already has no spaces, hyphens or underscores stays one lowercase token: "XMLHttpRequest" becomes "xmlhttprequest". Feed it space-, hyphen- or underscore-delimited words for correct results. PascalCase calls the same function and then uppercases the first character, so the two outputs differ only in that leading letter.

Yes. The transform trims, replaces runs of spaces and hyphens with an underscore, inserts an underscore at every lowercase-to-uppercase boundary using /([a-z])([A-Z])/g, strips any character outside [a-zA-Z0-9_], then lowercases. "getUserByID" becomes "get_user_by_id" and "User Profile-Settings" becomes "user_profile_settings". dot.case runs the identical pipeline with a period as the separator and also treats existing underscores as word boundaries, so "getUserByID" gives "get.user.by.id". Punctuation and accented characters are dropped rather than transliterated, because the strip step runs after the boundary split.

One fixed ruleset, and the exact rule matters. The text is lowercased first — so "NASA report" becomes "Nasa Report" — then every /\w+/ match is capitalized except the 18 small words a, an, and, as, at, but, by, for, if, in, of, on, or, the, to, up, via and with. The exemption is keyed on character offset, not word position: a small word stays lowercase unless it begins at offset 0, so leading whitespace lowercases even the first word. There is no AP, Chicago, MLA or APA selector, and no subtitle handling after a colon.

A lowercase, hyphen-delimited URL slug. It lowercases and trims, removes every character outside [A-Za-z0-9_\s-], turns runs of spaces and underscores into a single hyphen, collapses repeated hyphens, then strips leading and trailing hyphens. "Hello World_2026!" becomes "hello-world-2026". There is no separate kebab-case button — Slugify-text is the kebab-case output, and toKebabCase in the source is an alias of the same function. Non-ASCII letters are stripped rather than transliterated: "Café" becomes "caf", and Cyrillic or CJK text disappears entirely, so transliterate international copy before slugifying.

Matching is literal, never regex. Your search string is escaped against /[.*+?^${}()|[\]\\]/g before it is compiled into a global RegExp, so . ( ) and $ match themselves. The only exposed option is a Case sensitive checkbox, which switches the flags between 'g' and 'gi'; whole-word and raw-regex flags exist in the underlying options type but are hard-coded off in the UI. One gotcha: the replacement string goes straight to String.replace, so $&, $1 and $$ typed into the Replace field are still treated as substitution patterns. Replace All runs in one pass, with no match counter and no undo.

Characters is String.length, which counts spaces and UTF-16 code units, so an emoji outside the Basic Multilingual Plane counts as 2. Words trims the text and splits on /\s+/. Sentences counts matches of /[^.!?]+[.!?]+/g, so a trailing fragment with no terminal punctuation contributes nothing — "Hello world" reports 0 sentences. Lines splits on /\r\n|\r|\n/, which means a trailing newline adds one to the total. All four return 0 for empty or whitespace-only input, and all four are computed independently for the input pane and the preview pane.

The picker accepts .txt, .html, .csv, .json, .md, .xml and .log. A file passes if either its extension is on that list or its MIME type is text/plain, text/html, text/csv, application/json, text/markdown or text/xml; anything else is rejected with an error toast. There is no byte limit in the code — FileReader.readAsText loads the entire file into memory as one string held in React state. Multi-megabyte files therefore make the editor sluggish, because every keystroke and every transformation re-renders the full textarea. Split large logs or work in chunks.

Four each. Copy gives Plain Text; JSON Object as {"text", "stats"} indented two spaces; CSV, which replaces every newline with a comma; and JavaScript Array, a bracketed list of double-quoted lines. Download gives .txt, .csv (a "Text" header row plus the comma-joined body), .json (text, stats and an ISO 8601 generated timestamp) and .xml (an XML 1.0 UTF-8 declaration wrapping each line in a <line> element). None of the writers escape anything: a comma collapses the CSV, a double quote breaks the JavaScript Array, and < corrupts the XML. Files are named case-converted-YYYY-MM-DD, or case-preview-YYYY-MM-DD from the preview pane.

In-Place writes the result back into the editor you type in, replacing the source, so two conversions compound. Preview — the default — leaves the input untouched and writes to a read-only pane below the button grid, with its own character, word, sentence and line counts, its own Find & Replace, and its own copy, download and clear controls. One behaviour worth knowing: transformations always read the input pane, never the preview pane, so in Preview mode clicking a second format replaces the first result rather than chaining onto it. Only the preview's own Find & Replace edits preview text in place.

Partly. Flipping the Editor switch to Rich loads CKEditor 5 Classic through a dynamic import, with a toolbar limited to bold, italic, bulleted list, numbered list, undo and redo. In Rich mode the editor's HTML string is what the case functions receive, so tags are transformed too — UPPER CASE uppercases tag names. Switching back to Plain strips markup with /<[^>]*>/g but does not decode entities, so & survives as literal text. The preview pane has no rich mode; its Editor toggle is rendered disabled. For clean case conversion, stay in Plain.

Customer Reviews

0 out of 5 stars

Based on 0 reviews

Review data

5 star reviews

0%

4 star reviews

0%

3 star reviews

0%

2 star reviews

0%

1 star reviews

0%

Share your thoughts

If you've used this tool, share your thoughts with other users

Recent reviews

Latest Articles

Tips, guides, and insights from our blog