Methodology & Test Matrix

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:

  1. Quick Copy — one-tap presets for common blank/invisible/empty characters.
  2. Inspector — paste any text, reveal hidden characters, preview with [•] markers, and count true length.
  3. Cleaner — remove classes of invisible characters or whitelist allowed ones.
  4. 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:

  1. Click preset (e.g., “Copy ZWSP”).
  2. Paste into a hex inspector field (internal dev panel) and confirm code points.
  3. Paste into Inspector and verify it flags the correct character class.
  4. 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:

  1. Choose character(s) and set length.
  2. Confirm generated length via code point count and [•] preview.
  3. Stress test with large N (e.g., 5,000) to ensure no UI freeze.
  4. 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 labelExpected code pointsInspector labelStatus
ZWSP\u200BZero Width Space✅ Pass
ZWNJ\u200CZero Width Non-Joiner✅ Pass
ZWJ\u200DZero Width Joiner✅ Pass
NBSP\u00A0Non-Breaking Space✅ Pass
Hangul Filler\u3164Hangul Filler✅ Pass
Braille Blank\u2800Braille Pattern Blank✅ Pass
FEFF / ZWNBSP\uFEFFZero Width No-Break Space⚠️ Handle with care (BOM)

Inspector — visualization & metrics

ScenarioInputExpectedStatus/Notes
Single ZWSP\u200B[••] visually adjacent bullets; length=1
Mixed ZWNJ+ZWJ\u200C\u200DTwo labels; length=2; stable preview
NBSP between wordshello\u00A0worldVisible gap; label NBSP; length=11
Long run (1,000× ZWSP)repeat \u200BNo freeze; length=1000

Cleaner — remove vs whitelist

ModeInputExpected outputStatus
Remove zero-width grouphi\u200B\u200Dhi
Whitelist NBSP onlya\u200B\u00A0ba\u00A0b
Twice in a row (idempotent)(result above)Same result

Generator — length & composition

SetupExpectedObservedStatus
50× ZWSPlength=50length=50
10× (ZWNJ+ZWJ)length=20length=20
5,000× ZWSPresponsiveresponsive

Platform-focused checks (examples)

These are illustrative outcomes; we retest and log changes in /changelog.

PlatformUse caseExpected outcome (typical)Notes
Instagramcaption spacing using NBSPNBSP usually preserved; zero-width sometimes normalizedPrefer NBSP for visible “space”.
Facebookblank messageMay block pure invisiblesAdd visible char or follow platform rules.
TikTokbio formattingSome invisibles allowed, but can changeKeep it minimal; avoid deception.
Discordnickname/messageServer rules may restrictRespect community guidelines.
WhatsAppblank messageOften trims/blocksWe show safe alternatives.
Roblox / Minecraft / PUBG / AOV / Free Firedisplay namesApp rules vary; many restrict invisiblesWe do not recommend bypassing policies.

Accessibility & UX tests

AreaCheckPass criteria
Keyboard navigationTab/Enter work for all buttonsNo traps; visible focus rings
ARIA live“Copied!” announcementScreen readers announce success
High contrast & dark modeToggle & legibilityAdequate contrast, no hidden labels
Large inputInspector with long stringsSmooth 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.