RS (Record Separator) is ASCII code point 30 (0x1E), Unicode U+001E. It is a C0 control character that delimited individual records within a group — the second-lowest tier in ASCII's four-level separator hierarchy: US (0x1F), RS (0x1E), GS (0x1D), FS (0x1C). On early batch systems and paper tape, 0x1E marked where one logical record ended and the next began without requiring fixed-length fields. It still appears in some Unix tooling — notably as the default delimiter in GNU sort's --zero-terminated mode alternatives and in certain flat-file EDI interchange formats. UTF-8 encodes it as the single byte 0x1E; Unicode classifies it as Cc (Control) with the alias RECORD SEPARATOR.
char msg[] = "A\x1EB\x1EC";char *p = strtok(msg, "\x1E"); // split records on RSwhile (p) p = strtok(NULL, "\x1E"); // iterate each record
RS (ASCII 30) separates individual records within a data group. In the ASCII separator hierarchy, it's like a row delimiter — each RS marks the boundary between one data record and the next, similar to how newlines separate rows in a CSV.
Newline (LF, ASCII 10) is whitespace with rendering behavior — it moves the cursor to a new line. RS is a pure structural delimiter with no visual effect. RS was designed to separate data records regardless of how they're displayed, making it cleaner for machine parsing.
Yes, more than you'd expect. The 'ASCII-delimited text' format uses RS between records and US between fields. Some logging systems use RS to separate log entries since it can't appear in normal text, avoiding the quoting nightmare CSVs create.
It's worth considering if you need a delimiter that won't collide with data content. Unlike commas, tabs, or newlines, RS (0x1E) almost never appears in real text. The downside is that your data won't be human-readable without tooling.