U+2028
LINE SEPARATOR

Line break that many parsers and editors mishandle.

Codepoint
U+2028
Short
LS
Group
line-separator
Class
invisible
Default
replaced
Replaced by
U+000A

What it is

Unicode's own line and paragraph breaks, separate from the line feed and carriage return inherited from ASCII. They mean the same thing and are handled correctly by far fewer programs.

Where it comes from

From word processors, where it is the shift-return line break within a paragraph, and from anything that exported rich text without normalising its breaks.

It is best known for breaking JavaScript: for years it was a valid line terminator in source code but not inside a JSON string, so a valid JSON document could become invalid JavaScript when embedded directly.

When it belongs

Rarely enough that TraceFree replaces them with an ordinary line feed rather than deleting them: the break was meant, only the encoding of it was unusual.

What TraceFree does with it

PresetAction
conservativereplaced
defaultreplaced
report-onlyasked about
strictreplaced

Context guards can only ever make a cleanup gentler, never sharper. A rule saying “always remove” does not override them.

How to remove it

In TraceFree, turn on the clipboard watcher and copy the text — the finding appears with a before-and-after comparison of the affected lines. For files, a watched folder does the same, keeping a backup copy alongside.

How to write it

This page never prints the character itself, only ways of writing it. A page about invisible characters that contained invisible characters would be unreviewable — and that is the problem the program exists to solve.

NotationValue
UnicodeU+2028
Rust\u{2028}
JavaScript, Python\u2028
HTML
 

Regex (PCRE, Rust)\x{2028}

Related characters