Text steganography on Windows means embedding a hidden UTF-8 message inside ordinary-looking cover text by inserting zero-width Unicode characters into the visible string, with all encoding and decoding running locally in a modern browser. The cover sentence still reads the same to the human eye, but its underlying code-point sequence now carries a framed payload of U+200B and U+200C bits between U+2063 and U+2064 markers, inserted after the first visible code point. Because nothing is installed or uploaded, the technique works on any Windows 10 or Windows 11 machine with Edge, Chrome, or Firefox, including restricted accounts without admin rights. The catch is transport: Windows applications handle invisible characters very differently, and most chat, email, and rich-text systems will strip the payload before it reaches the recipient. This article walks through the Windows-specific path: how to hide a message, which copy channels on Windows preserve zero-width Unicode, and how to reveal the result so you can verify the round trip before relying on it.

How Text Steganography Works in a Windows Browser
The browser-based Text Steganography tool uses an explicit, documented convention rather than a hidden proprietary format. The hidden UTF-8 message is expanded one byte at a time, most-significant-bit first, and each bit is written as one of two zero-width characters: U+200B for binary 0 and U+200C for binary 1. The full bit string is wrapped between an invisible separator (U+2063) and an invisible plus (U+2064), then injected after the very first visible code point in the cover. Because every hidden byte becomes eight additional code points plus two framing markers, the resulting string is much longer than the original even though most fonts give those characters no width.
Reveal mode runs the same logic in reverse. It searches for the U+2063/U+2064 frame, checks that every character inside is one of the two bit symbols, requires a multiple of eight bits, converts the bits back to bytes, and rejects byte sequences that are not valid UTF-8. If any step fails, the tool reports an error rather than guessing. The recovered cover is returned alongside the hidden message so you can confirm byte-exact restoration. For a deeper look at why those particular code points were chosen, the zero-width Unicode basics walkthrough covers the same convention step by step.
Hide and Reveal a Message in Three Steps
- Enter cover and secret, then generate. Open the Text Steganography page in Edge, Chrome, or Firefox. Type or paste an ordinary cover sentence (up to 100,000 code points) and a separate hidden UTF-8 message (up to 10,000 bytes). Click the generate action and copy the resulting steganographic string exactly as it appears. Do not retype it.
- Copy through a channel that preserves zero-width characters. On Windows, the safest path is a plain-text editor such as Notepad, Notepad++, or Visual Studio Code opened on a UTF-8 encoded file, or a PowerShell session that uses Set-Clipboard. Avoid Word, Outlook, Teams, Discord, social networks, and any system that opens a rich-text composer.
- Paste into reveal mode and verify both outputs. Switch to reveal mode in the same tool, paste the received string without cleanup, and confirm that the recovered hidden message matches what you sent and that the visible cover matches your original sentence byte for byte. If extraction fails, the channel you used almost certainly dropped invisible characters.
Windows Channels That Preserve or Destroy the Payload
Windows hosts an unusually wide mix of text-handling pipelines, and each one treats default-ignorable code points differently. The table below sorts common Windows channels into rough risk bands based on how the tool's documentation describes sanitization behavior; treat it as a starting point, not a guarantee, and always run your own end-to-end test before relying on a channel for real data.
| Channel category on Windows | Likely to keep U+200B / U+200C / U+2063 / U+2064 | Notes |
|---|---|---|
| Plain-text editor (Notepad, Notepad++, VS Code) with UTF-8 encoding | Yes | Safest option on Windows. Save and reload as UTF-8, no BOM required. |
| PowerShell Set-Clipboard on Windows 10/11 | Usually | Works for short strings; long payloads may be truncated or normalized. |
| Browser copy and paste between two tabs | Usually | Edge and Chrome preserve zero-width characters when no rich-text target is involved. |
| Rich-text editors (Word, Outlook new message, OneNote) | Rarely | Formatting passes often drop default-ignorable code points during save or send. |
| Chat and email gateways (Teams, Outlook web, Gmail compose, Discord) | Rarely or never | Servers normalize, filter, or reject the marker code points before delivery. |
| Social networks, CMS editors, pastebins with sanitization | Never | Default-ignorable characters are stripped at ingest. |
| Screenshots, screen shares, printed copies, OCR | Never | Invisible code points have no pixels to capture. |
The single most common Windows failure mode is pasting into a rich-text composer and then copying back out: the formatting engine silently removes characters it considers invisible, and the recipient sees a cover sentence with no payload. The Unicode Security Considerations technical report lists the same class of sanitization problems and explains why default-ignorable code points are routinely stripped by content systems. If you have no choice but to send the steganographic text through a risky channel, treat the result as a probe: if reveal mode recovers your message on the other end, the channel works; if not, switch channels.
Limits, Validation, and What the Reveal Step Catches
The tool enforces two hard limits that matter on Windows because DOM rendering slows down with very long strings. The hidden message is capped at 10,000 UTF-8 bytes, and the cover is capped at 100,000 code points. Emoji and CJK characters can take several UTF-8 bytes each, so the apparent character count of your secret will often be smaller than the byte limit. The cover cannot already contain the U+2063 or U+2064 marker, because accepting one would make payload boundaries ambiguous; ordinary zero-width characters that fall outside the framed region are kept as part of the visible cover and will round-trip back to the same string.
Reveal mode is strict on purpose. It will report an error if the start or end marker is missing, if any character inside the frame is not U+200B or U+200C, if the bit count is not a multiple of eight, or if the resulting byte sequence is not valid UTF-8. The tool extracts only the first valid framed segment, so a cover sentence that happens to contain both markers in the wrong order can still cause a clean rejection rather than silent corruption. Visible equality never implies byte equality: two strings can render identically while their code-point sequences differ by hundreds of invisible characters, which is exactly the point of the convention, and exactly why a character counter, diff tool, or hex viewer will expose the payload immediately if someone knows to look.
When You Need Real Encryption Instead of Concealment
Steganography hides the existence of a message, not its meaning. Anyone who knows the U+200B / U+200C / U+2063 / U+2064 mapping can decode the payload, and anyone with edit access can change the hidden bits without detection. For passwords, API tokens, personal data, or anything that must remain confidential in transit, encrypt the message first with a reviewed primitive such as AES-256-GCM or a public-key system, then embed the ciphertext with this tool if you also need plausible deniability. Do not use the page to hide credentials, harmful instructions, or material that violates a platform's rules; many of the channels that preserve the payload are also the channels most likely to be monitored, and the framing markers can themselves look like a covert channel to automated scanners.
On Windows specifically, the practical advice is short: keep your cover short enough to inspect, prefer a plain-text file or a direct clipboard transfer that you have tested yourself, and always run reveal mode on the received string before trusting delivery. For durable data exchange, prefer visible encodings such as Base64 or an authenticated file format; the tool's documentation is explicit that the round-trip tests prove this implementation, not survival through any particular external service.
For a deeper look, see Binary to Text Chart: Reading 8-Bit UTF-8 Bytes.