BlankTextCopy provides an all-in-one toolkit to copy, inspect, clean, and generate blank text, invisible characters, and empty characters/space. This page explains how we test our app and content so users—and search engines—can trust what they see here. It also documents the Test Matrix we use across platforms like Instagram, Facebook, TikTok, Discord, WhatsApp, YouTube, Telegram, X (Twitter), and popular games (e.g., Roblox, Minecraft, PUBG Mobile, Arena of Valor, Free Fire) where formatting or display names may involve blank/invisible characters.
Last updated: 2025-09-20
Scope & goals
We validate four core modules of the app:
- Quick Copy — one-tap presets for common blank/invisible/empty characters.
- Inspector — paste any text, reveal hidden characters, preview with [•] markers, and count true length.
- Cleaner — remove classes of invisible characters or whitelist allowed ones.
- Generator — build custom-length blank strings (e.g., repeating ZWSP U+200B) and mixed sequences (e.g., ZWNJ U+200C + ZWJ U+200D), with visible [•] preview.
Primary characters under test (and typical labels used in docs):
- ZWSP (U+200B) Zero Width Space
- ZWNJ (U+200C) Zero Width Non-Joiner
- ZWJ (U+200D) Zero Width Joiner
- NBSP (U+00A0) Non-Breaking Space
- Hangul Filler (U+3164)
- Braille Pattern Blank (U+2800)
- FEFF (U+FEFF) Zero Width No-Break Space / BOM (treated carefully)
- (Advanced/optional) Word Joiner (U+2060)
Test principles
- Unicode-accurate: verify we copy the exact code points, not look-alike glyphs.
- Transparent visualization: the [•] preview frames the string (e.g.,
[•<content>•]
) so users can “see” length/position, even for zero-width characters. - Safety by design: we explain when a character is unsuitable (e.g., display names or inputs that reject invisibles).
- Platform-aware: we record observed behaviors; we do not claim “works everywhere.”
- Client-side privacy: test flows run in the browser; pasted content is not uploaded.
Procedures (how we test each module)
Quick Copy (presets)
Objective: Each preset must copy only the documented code points.
Steps:
- Click preset (e.g., “Copy ZWSP”).
- Paste into a hex inspector field (internal dev panel) and confirm code points.
- Paste into Inspector and verify it flags the correct character class.
- Paste into target inputs (e.g., Instagram bio, WhatsApp message, Discord chat) to observe behavior.
Pass criteria:
- Code points match exactly (e.g., ZWSP ⇒
\u200B
only). - Inspector shows the right tag (e.g., “Zero Width Space” highlight).
- No unintended normalization/conversion occurs in common targets.
Inspector (detect & preview)
Objective: Reliably reveal and classify invisible/blank characters and show a faithful [•] preview.
Detection logic (typical patterns):
- Core set (JS, with Unicode flag):
const INVISIBLE_RE = /[\u200B\u200C\u200D\u00A0\u2800\u3164\uFEFF]/gu; // Optional advanced: add \u2060 (WORD JOINER) when relevant
- We also track combining marks and whitespace variants where needed, but keep defaults focused on the “blank/invisible character” cluster to avoid over-flagging.
Preview rules:
- Wrap the entire input as
[•
+ content +•]
. - Provide both code point length and grapheme cluster estimates:
const codePoints = [...input].length; // code point length const clusters = (Intl && Intl.Segmenter) ? Array.from(new Intl.Segmenter(undefined, {granularity:'grapheme'}).segment(input)).length : codePoints;
- Tooltip/class badge labels each match (e.g., ZWSP U+200B, NBSP U+00A0).
Pass criteria:
- All preset characters are detected and labeled correctly.
- [•] preview reflects sequence length and positions (no swallowed markers).
- Long strings (≥1,000 chars) render without freezing UI.
Cleaner (remove or whitelist)
Objective: Remove selected classes (e.g., “strip all ZWSP/ZWNJ/ZWJ”), or keep specifically whitelisted ones (e.g., allow NBSP, remove others).
Default classes:
- Zero-width group: U+200B, U+200C, U+200D, U+FEFF (optionally U+2060).
- Blank glyph group: U+2800 (Braille Blank), U+3164 (Hangul Filler).
- Non-breaking group: U+00A0 (NBSP) — often optional to remove.
Idempotence tests:
- Running the cleaner twice yields the same result (no data loss beyond intent).
- Partial whitelist (e.g., keep NBSP) preserves intended characters.
Pass criteria:
- Cleaner removes exactly what is selected; nothing else.
- Case-mix strings (letters + invisibles) remain intact apart from removals.
Generator (build sequences)
Objective: Create correct lengths and compositions (e.g., “50× ZWSP”).
Steps:
- Choose character(s) and set length.
- Confirm generated length via code point count and [•] preview.
- Stress test with large N (e.g., 5,000) to ensure no UI freeze.
- Paste into Inspector to verify class labels.
Pass criteria:
- Lengths match input settings exactly.
- Mixed sequences respect order (e.g., ZWNJ + ZWJ patterns).
- Large output remains performant and copyable.
Test environments (where we check)
- Browsers/OS (desktop + mobile): recent Chrome, Safari, Firefox, Edge on Windows/macOS/Linux/iOS/Android.
- Social apps & messengers: Instagram, Facebook, TikTok, Discord, WhatsApp, Telegram, X.
- Games / profile inputs (illustrative): Roblox, Minecraft, PUBG Mobile, Arena of Valor, Free Fire.
Disclaimer: Every platform can change input rules and rendering at any time. We record observed behavior and update our notes/presets in the Changelog.
Test Matrix (snapshot)
Quick Copy presets — code point verification
Preset label | Expected code points | Inspector label | Status |
---|---|---|---|
ZWSP | \u200B | Zero Width Space | ✅ Pass |
ZWNJ | \u200C | Zero Width Non-Joiner | ✅ Pass |
ZWJ | \u200D | Zero Width Joiner | ✅ Pass |
NBSP | \u00A0 | Non-Breaking Space | ✅ Pass |
Hangul Filler | \u3164 | Hangul Filler | ✅ Pass |
Braille Blank | \u2800 | Braille Pattern Blank | ✅ Pass |
FEFF / ZWNBSP | \uFEFF | Zero Width No-Break Space | ⚠️ Handle with care (BOM) |
Inspector — visualization & metrics
Scenario | Input | Expected | Status/Notes |
---|---|---|---|
Single ZWSP | \u200B | [••] visually adjacent bullets; length=1 | ✅ |
Mixed ZWNJ+ZWJ | \u200C\u200D | Two labels; length=2; stable preview | ✅ |
NBSP between words | hello\u00A0world | Visible gap; label NBSP; length=11 | ✅ |
Long run (1,000× ZWSP) | repeat \u200B | No freeze; length=1000 | ✅ |
Cleaner — remove vs whitelist
Mode | Input | Expected output | Status |
---|---|---|---|
Remove zero-width group | hi\u200B\u200D | hi | ✅ |
Whitelist NBSP only | a\u200B\u00A0b | a\u00A0b | ✅ |
Twice in a row (idempotent) | (result above) | Same result | ✅ |
Generator — length & composition
Setup | Expected | Observed | Status |
---|---|---|---|
50× ZWSP | length=50 | length=50 | ✅ |
10× (ZWNJ+ZWJ) | length=20 | length=20 | ✅ |
5,000× ZWSP | responsive | responsive | ✅ |
Platform-focused checks (examples)
These are illustrative outcomes; we retest and log changes in /changelog.
Platform | Use case | Expected outcome (typical) | Notes |
---|---|---|---|
caption spacing using NBSP | NBSP usually preserved; zero-width sometimes normalized | Prefer NBSP for visible “space”. | |
blank message | May block pure invisibles | Add visible char or follow platform rules. | |
TikTok | bio formatting | Some invisibles allowed, but can change | Keep it minimal; avoid deception. |
Discord | nickname/message | Server rules may restrict | Respect community guidelines. |
blank message | Often trims/blocks | We show safe alternatives. | |
Roblox / Minecraft / PUBG / AOV / Free Fire | display names | App rules vary; many restrict invisibles | We do not recommend bypassing policies. |
Accessibility & UX tests
Area | Check | Pass criteria |
---|---|---|
Keyboard navigation | Tab/Enter work for all buttons | No traps; visible focus rings |
ARIA live | “Copied!” announcement | Screen readers announce success |
High contrast & dark mode | Toggle & legibility | Adequate contrast, no hidden labels |
Large input | Inspector with long strings | Smooth scroll, no jank |
Performance & privacy tests
- Client-side only: Pasted text is processed locally (Inspector/Cleaner).
- No heavy dependencies: First load stays small; tool interactions are instant.
- Stress tests: Long sequences (≥10k) still responsive in modern browsers.
- No data selling: See /privacy for details.
Change management
- Major updates (behavior changes, new presets, detection rules) are logged in /changelog with date, what changed, and why.
- Character pages (e.g., /unicode/zwsp-u200b) include a “Last updated” stamp and link to relevant changelog entries.
Reproducible examples (dev notes)
Detect common blank/invisible characters (JavaScript)
// Minimal set used by our default Inspector:
const INVISIBLE_RE = /[\u200B\u200C\u200D\u00A0\u2800\u3164\uFEFF]/gu;
// Optional: Add \u2060 (WORD JOINER) if needed for advanced cases
function findInvisibles(str) {
const matches = [];
for (const m of str.matchAll(INVISIBLE_RE)) {
matches.push({ index: m.index, char: m[0], cp: m[0].codePointAt(0).toString(16) });
}
return matches;
}
Remove zero-width characters but keep NBSP
const ZERO_WIDTH_RE = /[\u200B\u200C\u200D\uFEFF]/gu;
function cleanZeroWidthKeepNbsp(str) { return str.replace(ZERO_WIDTH_RE, ''); }
Count code points vs grapheme clusters
const codePoints = [...input].length;
const clusters = (Intl && Intl.Segmenter)
? Array.from(new Intl.Segmenter(undefined, {granularity:'grapheme'}).segment(input)).length
: codePoints;
These snippets mirror what we test in the app so developers can reproduce outcomes when working with blank text / invisible / empty characters.
Responsible use
Blank/invisible characters can be misused. We do not encourage violating platform rules or impersonation. Use them for formatting, accessibility, and legitimate layout needs. When in doubt, follow the platform’s Terms of Service.
Contact & feedback
If you observe different behavior on Instagram, Facebook, TikTok, Discord, WhatsApp, or any game inputs, please mail [email protected] with your environment and steps. We’ll verify and update the Test Matrix and Changelog accordingly.