Once upon a time, people didn't have personal computers on their desks. Instead, they had terminals, which were like black and white TVs with keyboards attached to them, and a serial cable going into the wall. On the other end of the serial cable, there was a host computer, typically running VMS or Unix or some mainframe operating system.

Now, not all terminals were alike. Different companies made them differently. In particular, there were two competing standards for what the "I screwed up, go back one character and let me do it again" key would look like, and how it would act.

One company -- Digital Equipment Corporation, or DEC -- made that key say Delete, and made it send a DEL character to the host computer. Another company -- International Business Machines, or IBM -- made that key say Backspace, and made it send a BS character to the host computer.

These two companies dominated the terminal market, and most of the other companies followed one or the other. Very quickly, the market was divided into two standards for what the key did.

Now, imagine for the moment that you've got a terminal on your desk, and that it's connected to a host computer running some variant of Unix. When you login and start typing stuff, your terminal sends a bunch of bytes to the host computer. The host computer has to understand what all of these bytes mean, or it won't act correctly. But how can the host computer know which kind of terminal you're using? There was no autodetection of this stuff. (Some terminals could be queried with a sequence of bytes by the host computer, but the means of doing this was also nonstandard!)

So, your Unix host computer had to assume a default terminal standard -- in other words, it had to guess. Once you got to the command line shell, you could issue commands to tell it what kind of terminal you were using, but until you had done this, you might or might not be able to use your Backspace (or Delete) key.

Now, in order to understand the ^H^H meme, you also need to know a couple other things. The first is that the BS byte sent by IBM terminals has a numeric value of 8, while the DEL byte sent by DEC terminals has a numeric value of 127. Both of these values are unprintable ASCII characters, meaning they don't have a fixed glyph or symbol to represent them in printed form. The second is that, under the right circumstances, a host computer's shell (or other applications) may sometimes represent unprintable ASCII characters by using a ^ (caret) glyph followed by another glyph. Typically the first several bytes of the ASCII table are represented by ^@ for 0, ^A for 1, ^B for 2, and so on. This means ^H represents ASCII byte 8, or BS.

So, suppose you're using an IBM terminal, and you're connected to a host computer that assumes you're using a DEC terminal. You're at a command shell, and you're typing along:

$ cat myfl^Hile

What happened here? You typed myfl when you meant to type myfi, and you pressed the Backspace key to erase the l. But the host computer expected DEL instead of BS, so it didn't realize that the BS byte your terminal sent was intended to erase a character. The host computer took it as a literal part of a filename (which Unix permits).

Obviously this got very frustrating, very fast. And yet there was no simple, elegant solution to the problem. Some command shells accept both BS and DEL bytes and interpret both of them as "erase the previous character", but that only delays the problem. Once you're inside a text editor, or a mail reader, or some other application that isn't the shell, the same issue resurfaces.

Eventually, Unix terminal users got so accustomed to the situation that it had become part of their culture. It started to become a joke, or what we would today call a meme. When composing electronic mail or Usenet messages, one sometimes used ^H^H intentionally to indicate a strikethrough. (You're probably reading this in HTML, which supports strikethrough markup. ASCII does not.)

So, someone who understands this meme, and who expects their target audience to understand it as well, might write a message like:

At 5:00 I plan to get drunk^H^H^H^H^H^H^H^H^Hgo home and rest.

In modern HTML, the same message would be written like this instead:

At 5:00 I plan to get drunkgo home and rest.