IRC Formatting
This document describes what I consider to be almost universally understood formatting. It is a living specification which is updated in response to feedback and implementations as they change.
If I've missed out on some formatting character or method which is understood by a majority of IRC software in use today, or have made a mistake in this document, please open an issue or contact me.
Introduction
IRC clients today understand a number of special formatting characters. These characters allow IRC software to send and receive colors and formatting codes such as bold, italics, underline and others.
Over the years, many clients have attempted to create their own methods of formatting and there have been variations and extensions of almost every method. However, the characters and codes described in this document are understood fairly consistently across clients today.
Following what’s described in this document should let your software send and interpret formatting in a fairly sane way, consistent with how most other IRC software out there does. Using formatting characters and methods not described in this document is possible, but it should be assumed they will not work across most clients (unless there is some way to fall back to what’s defined here).
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC2119.
Table of Contents
Formatting Uses
Formatting is widely used in IRC. In this section, we outline the places where formatting is traditionally used by clients and allowed by servers. This is not an expansive list nor does it note everywhere formatting is used, just some of the most common places.
Messages / Numerics
Formatting characters can be used in lots of IRC messages and numerics. This is not a complete list, just some of the messages formatting codes are used with most often.
These are some of the messages and features formatting codes are normally used with:
And the numerics containing content associated with these messages and features.
Names
Formatting is allowed and commonly used in realnames (set with the USER
command when the client joins the network).
On some networks and with some server software, vhosts (vanity hostnames) may contain formatting characters and codes. Hostnames sent to clients MAY contain formatting, and clients SHOULD display them with this in mind.
The use of formatting MUST NOT be allowed in nicknames, user names or channel names. This is to avoid confusion and prevent issues, particularly with clients that have disabled the rendering of colors / formatting or cannot display certain types of formatting.
If a client sends a USER
command with any formatting codes in the first parameter (in the username) during registration, the server SHOULD send the client an ERROR
message and close the connection.
Client Behaviour
This section is non-normative and outlines suggested behaviour for clients and client interfaces.
Limitations
If an IRC client cannot display a specified type of formatting, the client should do one of the following:
- Simply not display the formatting.
- Display the formatting character in an obvious way, so users are aware that it was used.
One way some clients represent formatting characters they cannot display is using an uppercase letter which represents the specific formatting character, with their default foreground and background colors switched. For example, displaying an underline formatting character as U.
Preventing Display of Formatting
Clients may allow users to prevent all or just specified formatting from displaying. This can help users that are colorblind or are visually impaired, and should be considered by client authors.
ANSI Escape Code Support
IRC clients supporting ANSI formatting was, historically, due to clients outputting messages via terminals that supported ANSI escape codes. Many IRC clients today do not display through an interface that natively supports ANSI escape codes, and so must implement this behaviour themselves if they wish to support it.
Clients can support or not support ANSI escape codes as they like. However, they should implement this feature with the knowledge that a large number of IRC clients today, even those using a terminal interface, do not support displaying text formatted using ANSI escape codes.
Characters
There are a number of formatting characters that are parsed and understood by IRC software today.
Some formatting codes work as a toggle, i.e. with the first instance of the character, the specified formatting is enabled for the following text. After the next instance of that character, that formatting is disabled for the following characters. Formatting codes that work in this way are called ‘togglable’.
These formatting characters are the ones all IRC clients should understand.
Bold
ASCII 0x02
This formatting character works as a toggle. It enables bold text (e.g. bold text).
Italics
ASCII 0x1D
This formatting character works as a toggle. It enables italicized text (e.g. italicised text).
Underline
ASCII 0x1F
This formatting character works as a toggle. It enables underlined text (e.g. underlined text).
Strikethrough
ASCII 0x1E
This formatting character works as a toggle. It enables strikethrough’d text (e.g. strokethrough text).
This character is a relatively new addition, and was defined by Textual. As of right now, at least HexChat, IRCCloud, The Lounge and Textual are known to support it.
Monospace
ASCII 0x11
This formatting character works as a toggle. It enables monospace’d text (e.g. monospace text).
This character is a relatively new addition, and was defined by IRCCloud. However, a number of other clients including TheLounge and Textual now support this as well, and it’s now the defacto formatting character for monospace text.
Color
ASCII 0x03
This formatting character sets or resets colors on the following text.
With this formatting code, colors are represented as ASCII digits.
Forms of Color Codes
In the following list, <CODE>
represents the color formatting character (0x03)
, <COLOR>
represents one or two ASCII digits (either 0-9
or 00-99
).
The use of this code can take on the following forms:
-
<CODE>
- Reset foreground and background colors. -
<CODE>,
- Reset foreground and background colors and display the,
character as text. -
<CODE><COLOR>
- Set the foreground color. -
<CODE><COLOR>,
- Set the foreground color and display the,
character as text. -
<CODE><COLOR>,<COLOR>
- Set the foreground and background color.
The foreground color is the first <COLOR>
, and the background color is the second <COLOR>
(if sent).
If only the foreground color is set, the background color stays the same.
If there are two ASCII digits available where a <COLOR> is allowed, then two characters MUST always be read for it and displayed as described below.
Colors
The following colors are defined for use with this formatting character:
- - 00 - White.
- - 01 - Black.
- - 02 - Blue.
- - 03 - Green.
- - 04 - Red.
- - 05 - Brown.
- - 06 - Magenta.
- - 07 - Orange.
- - 08 - Yellow.
- - 09 - Light Green.
- - 10 - Cyan.
- - 11 - Light Cyan.
- - 12 - Light Blue.
- - 13 - Pink.
- - 14 - Grey.
- - 15 - Light Grey.
- - 99 - Default Foreground/Background - Not universally supported.
In addition, the table below describes the commonly-used colors for codes 16-98.
Mistaken Eating of Text
When sending color codes 0-9
, clients may use either the one-digit (3)
or two-digit (03)
versions of it. However, since two digits are always used if available, if the text following the color code starts with a digit, the last <COLOR>
MUST use the two-digit version to be displayed correctly. This ensures that the first character of the text does not get interpreted as part of the formatting code.
If the text immediately following a code setting a foreground color consists of something like ",13"
, it will get interpreted as setting the background rather than text. In this example, clients can put the color code either after the comma character or before the character in front of the comma character to avoid this. They can also put a different formatting code after the comma to ensure that the number does not get interpreted as part of the color code (for instance, two bold characters in a row, which will cancel each other out as they are toggles).
‘Spoilers’
If the background and foreground colors are the same for a section of text, on ‘hovering over’ or selecting this text these colours should be replaced with readable alternatives. For example:
this is spoilered text
Colors 16-98
When you receive the color codes 16-98, you should display them using the RGB values in this table:
16 470000 | 17 472100 | 18 474700 | 19 324700 | 20 004700 | 21 00472c | 22 004747 | 23 002747 | 24 000047 | 25 2e0047 | 26 470047 | 27 47002a |
28 740000 | 29 743a00 | 30 747400 | 31 517400 | 32 007400 | 33 007449 | 34 007474 | 35 004074 | 36 000074 | 37 4b0074 | 38 740074 | 39 740045 |
40 b50000 | 41 b56300 | 42 b5b500 | 43 7db500 | 44 00b500 | 45 00b571 | 46 00b5b5 | 47 0063b5 | 48 0000b5 | 49 7500b5 | 50 b500b5 | 51 b5006b |
52 ff0000 | 53 ff8c00 | 54 ffff00 | 55 b2ff00 | 56 00ff00 | 57 00ffa0 | 58 00ffff | 59 008cff | 60 0000ff | 61 a500ff | 62 ff00ff | 63 ff0098 |
64 ff5959 | 65 ffb459 | 66 ffff71 | 67 cfff60 | 68 6fff6f | 69 65ffc9 | 70 6dffff | 71 59b4ff | 72 5959ff | 73 c459ff | 74 ff66ff | 75 ff59bc |
76 ff9c9c | 77 ffd39c | 78 ffff9c | 79 e2ff9c | 80 9cff9c | 81 9cffdb | 82 9cffff | 83 9cd3ff | 84 9c9cff | 85 dc9cff | 86 ff9cff | 87 ff94d3 |
88 000000 | 89 131313 | 90 282828 | 91 363636 | 92 4d4d4d | 93 656565 | 94 818181 | 95 9f9f9f | 96 bcbcbc | 97 e2e2e2 | 98 ffffff |
If displaying this on an ANSI terminal, these ANSI color codes should be used:
16 52 | 17 94 | 18 100 | 19 58 | 20 22 | 21 29 | 22 23 | 23 24 | 24 17 | 25 54 | 26 53 | 27 89 |
28 88 | 29 130 | 30 142 | 31 64 | 32 28 | 33 35 | 34 30 | 35 25 | 36 18 | 37 91 | 38 90 | 39 125 |
40 124 | 41 166 | 42 184 | 43 106 | 44 34 | 45 49 | 46 37 | 47 33 | 48 19 | 49 129 | 50 127 | 51 161 |
52 196 | 53 208 | 54 226 | 55 154 | 56 46 | 57 86 | 58 51 | 59 75 | 60 21 | 61 171 | 62 201 | 63 198 |
64 203 | 65 215 | 66 227 | 67 191 | 68 83 | 69 122 | 70 87 | 71 111 | 72 63 | 73 177 | 74 207 | 75 205 |
76 217 | 77 223 | 78 229 | 79 193 | 80 157 | 81 158 | 82 159 | 83 153 | 84 147 | 85 183 | 86 219 | 87 212 |
88 16 | 89 233 | 90 235 | 91 237 | 92 239 | 93 241 | 94 244 | 95 247 | 96 250 | 97 254 | 98 231 |
Hex Color
ASCII 0x04
Some clients support an alternate form of conveying colours using hex codes.
Following this character are six hex digits representing the Red, Green and Blue values of the colour to display (e.g. FF0000
means bright red).
Keep the Forms of Color Codes section above in mind, as this method of formatting keeps these same rules – the exceptions being that <CODE>
represents the hex color character (0x04)
and <COLOR>
represents a six-digit hex value as RRGGBB
.
This method of formatting is not as widely-supported as the colors above, but clients are fine to parse them without any negative effects.
Reverse Color
ASCII 0x16
This formatting character works as a toggle. When reverse color is enabled, the foreground and background text colors are reversed. For instance, if you enable reverse color and then send the line “C3,13Test!”, you will end up with pink foreground text and green background text while the reverse color is in effect.
This code isn’t super well-supported, and mIRC seems to always treat it as applying the reverse of the default foreground and background characters, rather than the current fore/background as set by prior mIRC color codes in the message.
Reset
ASCII 0x0F
This formatting character resets all formatting. It removes the bold, italics, and underline formatting, and sets the foreground and background colors back to the default for the client display. The text following this character will use or display no formatting, until other formatting characters are encountered.
Examples
In this section, the color formatting character (0x03)
is displayed as C, the bold character (0x02)
is displayed as B, the italics character (0x1D)
is displayed as I, and the reset character (0x0F)
is displayed as O.
Each example displays both the raw IRC code sent, and then a formatted version of the output.
-
Code: I love C3IRC! CIt is the C7best protocol ever!
Output: I love IRC! It is the best protocol ever! -
Code: This is a IC13,9cool Cmessage
Output: This is a cool message -
Code: IRC Bis C4,12so CgreatO!
Output: IRC is so great! -
Code: Rules: Don't spam 5C13,8,6C,7,8, and especially not B9BI!
Output: Rules: Don't spam 5,6,7,8, and especially not 9!
Acknowledgements
Thanks to Nei for some guidance on the extended color codes!