{
  "version": "v1",
  "kind": "whitespace",
  "description": "Zero-width characters, no-break and fixed-width spaces, line separators, control characters",
  "count": 33,
  "seed": null,
  "items": [
    {
      "id": "whitespace-01",
      "text": "Hello​World",
      "note": "Zero-width space U+200B",
      "lang": null,
      "length": {
        "codepoints": 11,
        "utf16_units": 11,
        "utf8_bytes": 13
      },
      "codepoints": "U+0048 U+0065 U+006C U+006C U+006F U+200B U+0057 U+006F U+0072 U+006C U+0064"
    },
    {
      "id": "whitespace-02",
      "text": "Hello‌World",
      "note": "Zero-width non-joiner U+200C",
      "lang": null,
      "length": {
        "codepoints": 11,
        "utf16_units": 11,
        "utf8_bytes": 13
      },
      "codepoints": "U+0048 U+0065 U+006C U+006C U+006F U+200C U+0057 U+006F U+0072 U+006C U+0064"
    },
    {
      "id": "whitespace-03",
      "text": "Hello‍World",
      "note": "Zero-width joiner U+200D",
      "lang": null,
      "length": {
        "codepoints": 11,
        "utf16_units": 11,
        "utf8_bytes": 13
      },
      "codepoints": "U+0048 U+0065 U+006C U+006C U+006F U+200D U+0057 U+006F U+0072 U+006C U+0064"
    },
    {
      "id": "whitespace-04",
      "text": "Hello⁠World",
      "note": "Word joiner U+2060",
      "lang": null,
      "length": {
        "codepoints": 11,
        "utf16_units": 11,
        "utf8_bytes": 13
      },
      "codepoints": "U+0048 U+0065 U+006C U+006C U+006F U+2060 U+0057 U+006F U+0072 U+006C U+0064"
    },
    {
      "id": "whitespace-05",
      "text": "Hello﻿World",
      "note": "Zero-width no-break space / BOM U+FEFF inside text",
      "lang": null,
      "length": {
        "codepoints": 11,
        "utf16_units": 11,
        "utf8_bytes": 13
      },
      "codepoints": "U+0048 U+0065 U+006C U+006C U+006F U+FEFF U+0057 U+006F U+0072 U+006C U+0064"
    },
    {
      "id": "whitespace-06",
      "text": "﻿Starts with a BOM",
      "note": "Leading BOM U+FEFF (often stripped or shown as junk)",
      "lang": null,
      "length": {
        "codepoints": 18,
        "utf16_units": 18,
        "utf8_bytes": 20
      },
      "codepoints": "U+FEFF U+0053 U+0074 U+0061 U+0072 U+0074 U+0073 U+0020 U+0077 U+0069 U+0074 U+0068 U+0020 U+0061 U+0020 U+0042 U+004F U+004D"
    },
    {
      "id": "whitespace-07",
      "text": "10 000",
      "note": "No-break space U+00A0",
      "lang": null,
      "length": {
        "codepoints": 6,
        "utf16_units": 6,
        "utf8_bytes": 7
      },
      "codepoints": "U+0031 U+0030 U+00A0 U+0030 U+0030 U+0030"
    },
    {
      "id": "whitespace-08",
      "text": "10 000 €",
      "note": "Narrow no-break space U+202F (French number formatting)",
      "lang": "fr",
      "length": {
        "codepoints": 8,
        "utf16_units": 8,
        "utf8_bytes": 14
      },
      "codepoints": "U+0031 U+0030 U+202F U+0030 U+0030 U+0030 U+202F U+20AC"
    },
    {
      "id": "whitespace-09",
      "text": "Thin space Hair space",
      "note": "Thin space U+2009 and hair space U+200A",
      "lang": null,
      "length": {
        "codepoints": 21,
        "utf16_units": 21,
        "utf8_bytes": 25
      },
      "codepoints": "U+0054 U+0068 U+0069 U+006E U+2009 U+0073 U+0070 U+0061 U+0063 U+0065 U+0020 U+0048 U+0061 U+0069 U+0072 U+200A U+0073 U+0070 U+0061 U+0063 U+0065"
    },
    {
      "id": "whitespace-10",
      "text": "En space Em space Figure space Punctuation space",
      "note": "Fixed-width spaces U+2002 U+2003 U+2007 U+2008",
      "lang": null,
      "length": {
        "codepoints": 48,
        "utf16_units": 48,
        "utf8_bytes": 56
      },
      "codepoints": null
    },
    {
      "id": "whitespace-11",
      "text": "Ogham space",
      "note": "Ogham space mark U+1680",
      "lang": null,
      "length": {
        "codepoints": 11,
        "utf16_units": 11,
        "utf8_bytes": 13
      },
      "codepoints": "U+004F U+0067 U+0068 U+0061 U+006D U+1680 U+0073 U+0070 U+0061 U+0063 U+0065"
    },
    {
      "id": "whitespace-12",
      "text": "Ideographic　space",
      "note": "Ideographic space U+3000",
      "lang": null,
      "length": {
        "codepoints": 17,
        "utf16_units": 17,
        "utf8_bytes": 19
      },
      "codepoints": "U+0049 U+0064 U+0065 U+006F U+0067 U+0072 U+0061 U+0070 U+0068 U+0069 U+0063 U+3000 U+0073 U+0070 U+0061 U+0063 U+0065"
    },
    {
      "id": "whitespace-13",
      "text": "Tab\there",
      "note": "Horizontal tab",
      "lang": null,
      "length": {
        "codepoints": 8,
        "utf16_units": 8,
        "utf8_bytes": 8
      },
      "codepoints": "U+0054 U+0061 U+0062 U+0009 U+0068 U+0065 U+0072 U+0065"
    },
    {
      "id": "whitespace-14",
      "text": "Line\r\nbreak",
      "note": "CRLF line break",
      "lang": null,
      "length": {
        "codepoints": 11,
        "utf16_units": 11,
        "utf8_bytes": 11
      },
      "codepoints": "U+004C U+0069 U+006E U+0065 U+000D U+000A U+0062 U+0072 U+0065 U+0061 U+006B"
    },
    {
      "id": "whitespace-15",
      "text": "Line\rbreak",
      "note": "Lone carriage return",
      "lang": null,
      "length": {
        "codepoints": 10,
        "utf16_units": 10,
        "utf8_bytes": 10
      },
      "codepoints": "U+004C U+0069 U+006E U+0065 U+000D U+0062 U+0072 U+0065 U+0061 U+006B"
    },
    {
      "id": "whitespace-16",
      "text": "Line separator",
      "note": "Line separator U+2028 (broke JavaScript string literals before ES2019)",
      "lang": null,
      "length": {
        "codepoints": 14,
        "utf16_units": 14,
        "utf8_bytes": 16
      },
      "codepoints": "U+004C U+0069 U+006E U+0065 U+2028 U+0073 U+0065 U+0070 U+0061 U+0072 U+0061 U+0074 U+006F U+0072"
    },
    {
      "id": "whitespace-17",
      "text": "Paragraph separator",
      "note": "Paragraph separator U+2029",
      "lang": null,
      "length": {
        "codepoints": 19,
        "utf16_units": 19,
        "utf8_bytes": 21
      },
      "codepoints": "U+0050 U+0061 U+0072 U+0061 U+0067 U+0072 U+0061 U+0070 U+0068 U+2029 U+0073 U+0065 U+0070 U+0061 U+0072 U+0061 U+0074 U+006F U+0072"
    },
    {
      "id": "whitespace-18",
      "text": "Nextline",
      "note": "Next line (NEL) U+0085",
      "lang": null,
      "length": {
        "codepoints": 9,
        "utf16_units": 9,
        "utf8_bytes": 10
      },
      "codepoints": "U+004E U+0065 U+0078 U+0074 U+0085 U+006C U+0069 U+006E U+0065"
    },
    {
      "id": "whitespace-19",
      "text": "Vertical\u000btab",
      "note": "Vertical tab U+000B",
      "lang": null,
      "length": {
        "codepoints": 12,
        "utf16_units": 12,
        "utf8_bytes": 12
      },
      "codepoints": "U+0056 U+0065 U+0072 U+0074 U+0069 U+0063 U+0061 U+006C U+000B U+0074 U+0061 U+0062"
    },
    {
      "id": "whitespace-20",
      "text": "Form\ffeed",
      "note": "Form feed U+000C",
      "lang": null,
      "length": {
        "codepoints": 9,
        "utf16_units": 9,
        "utf8_bytes": 9
      },
      "codepoints": "U+0046 U+006F U+0072 U+006D U+000C U+0066 U+0065 U+0065 U+0064"
    },
    {
      "id": "whitespace-21",
      "text": "Null\u0000byte",
      "note": "NUL U+0000 (truncates C strings, rejected by PostgreSQL text)",
      "lang": null,
      "length": {
        "codepoints": 9,
        "utf16_units": 9,
        "utf8_bytes": 9
      },
      "codepoints": "U+004E U+0075 U+006C U+006C U+0000 U+0062 U+0079 U+0074 U+0065"
    },
    {
      "id": "whitespace-22",
      "text": "Soft­hyphen",
      "note": "Soft hyphen U+00AD (invisible unless the line breaks there)",
      "lang": null,
      "length": {
        "codepoints": 11,
        "utf16_units": 11,
        "utf8_bytes": 12
      },
      "codepoints": "U+0053 U+006F U+0066 U+0074 U+00AD U+0068 U+0079 U+0070 U+0068 U+0065 U+006E"
    },
    {
      "id": "whitespace-23",
      "text": "  leading and trailing spaces  ",
      "note": "Leading and trailing spaces",
      "lang": null,
      "length": {
        "codepoints": 31,
        "utf16_units": 31,
        "utf8_bytes": 31
      },
      "codepoints": "U+0020 U+0020 U+006C U+0065 U+0061 U+0064 U+0069 U+006E U+0067 U+0020 U+0061 U+006E U+0064 U+0020 U+0074 U+0072 U+0061 U+0069 U+006C U+0069 U+006E U+0067 U+0020 U+0073 U+0070 U+0061 U+0063 U+0065 U+0073 U+0020 U+0020"
    },
    {
      "id": "whitespace-24",
      "text": "Multiple     spaces",
      "note": "Five consecutive spaces (collapsed in HTML)",
      "lang": null,
      "length": {
        "codepoints": 19,
        "utf16_units": 19,
        "utf8_bytes": 19
      },
      "codepoints": "U+004D U+0075 U+006C U+0074 U+0069 U+0070 U+006C U+0065 U+0020 U+0020 U+0020 U+0020 U+0020 U+0073 U+0070 U+0061 U+0063 U+0065 U+0073"
    },
    {
      "id": "whitespace-25",
      "text": "trailing newline\n",
      "note": "Trailing newline",
      "lang": null,
      "length": {
        "codepoints": 17,
        "utf16_units": 17,
        "utf8_bytes": 17
      },
      "codepoints": "U+0074 U+0072 U+0061 U+0069 U+006C U+0069 U+006E U+0067 U+0020 U+006E U+0065 U+0077 U+006C U+0069 U+006E U+0065 U+000A"
    },
    {
      "id": "whitespace-26",
      "text": "   ",
      "note": "Only spaces",
      "lang": null,
      "length": {
        "codepoints": 3,
        "utf16_units": 3,
        "utf8_bytes": 3
      },
      "codepoints": "U+0020 U+0020 U+0020"
    },
    {
      "id": "whitespace-27",
      "text": "   ",
      "note": "Only no-break spaces (not stripped by many trim() implementations)",
      "lang": null,
      "length": {
        "codepoints": 3,
        "utf16_units": 3,
        "utf8_bytes": 6
      },
      "codepoints": "U+00A0 U+00A0 U+00A0"
    },
    {
      "id": "whitespace-28",
      "text": "​",
      "note": "Only a zero-width space (looks empty, is not)",
      "lang": null,
      "length": {
        "codepoints": 1,
        "utf16_units": 1,
        "utf8_bytes": 3
      },
      "codepoints": "U+200B"
    },
    {
      "id": "whitespace-29",
      "text": "",
      "note": "Empty string",
      "lang": null,
      "length": {
        "codepoints": 0,
        "utf16_units": 0,
        "utf8_bytes": 0
      },
      "codepoints": ""
    },
    {
      "id": "whitespace-30",
      "text": "ㅤ",
      "note": "Hangul filler U+3164 (renders blank, used to fake empty names)",
      "lang": null,
      "length": {
        "codepoints": 1,
        "utf16_units": 1,
        "utf8_bytes": 3
      },
      "codepoints": "U+3164"
    },
    {
      "id": "whitespace-31",
      "text": "⠀",
      "note": "Braille pattern blank U+2800 (renders blank)",
      "lang": null,
      "length": {
        "codepoints": 1,
        "utf16_units": 1,
        "utf8_bytes": 3
      },
      "codepoints": "U+2800"
    },
    {
      "id": "whitespace-32",
      "text": "᠎",
      "note": "Mongolian vowel separator U+180E (was whitespace before Unicode 6.3)",
      "lang": null,
      "length": {
        "codepoints": 1,
        "utf16_units": 1,
        "utf8_bytes": 3
      },
      "codepoints": "U+180E"
    },
    {
      "id": "whitespace-33",
      "text": "ᅟᅠ",
      "note": "Hangul choseong and jungseong fillers",
      "lang": null,
      "length": {
        "codepoints": 2,
        "utf16_units": 2,
        "utf8_bytes": 6
      },
      "codepoints": "U+115F U+1160"
    }
  ]
}