Markdown Special Symbols: The Complete Guide

Symbol issues are probably one of the most common frustrations when writing Markdown. You might have run into these situations:

  • You want to display an asterisk *, but it turns into italic or bold markup
  • You type something starting with #, and it gets rendered as a heading
  • You need a copyright symbol © or a registered trademark ®, but can't find them on your keyboard
  • When writing math, < and > get swallowed as HTML tags

These problems all come down to Markdown special symbols. This article will explain everything clearly — which symbols have special meaning in Markdown, how to display them as-is, and how to insert all kinds of symbols you might need.

Formatting Control Symbols in Markdown

Let's get one thing straight first: Markdown doesn't have "reserved words." Its entire syntax is built on punctuation characters. The CommonMark spec defines the following characters as formatting markers when they appear in specific positions:

SymbolCharacterPurpose in Markdown
Asterisk*Bold, italic, unordered lists
Underscore_Bold, italic
Hash#Headings (H1-H6)
Backtick`Inline code, code blocks
Square brackets[ ]Link text, image alt text
Parentheses( )Link URL, image URL
Angle brackets< >HTML tags, autolinks
Curly braces{ }Some extended syntax (e.g., LaTeX)
Plus sign+Unordered lists
Hyphen-Unordered lists, horizontal rules, tables
Period.Ordered lists (with numbers)
Exclamation mark!Image marker
Pipe\|Table column separator
Tilde~Strikethrough (GFM extension)
Dollar sign$LaTeX math (some platforms)
Caret^Superscript (some extensions)

The key thing: these symbols don't always have special meaning. For example, * sitting alone in the middle of a sentence usually won't trigger formatting — it only becomes italic markup when it wraps around words. And # only means "heading" when it's at the start of a line.

Three Ways to Display Special Symbols As-Is

Now that you know which symbols have special meaning, the next question is — how do you just show the symbol itself without it becoming a formatting marker? There are three methods.

Method 1: Backslash Escaping (Most Common)

Put a backslash \ before the symbol, and the Markdown parser will skip it and display the raw character. This is the standard mechanism defined by the CommonMark spec.

\*This is not italic\*
\# This is not a heading
\[This is not a link\](https://example.com)

Rendered output:

*This is not italic* # This is not a heading [This is not a link](https://example.com)

The CommonMark spec explicitly lists 12 ASCII punctuation characters that can be escaped with a backslash:

\   `   *   _   {   }   [   ]   (   )   #   +   -   .   !   |

Honestly, most of the time you only need to remember \*, \#, and \| — those are the most commonly needed. The others rarely require escaping in normal writing.

One thing to note: the backslash can only escape characters from the list above. If you write \a or \中, the backslash itself will be preserved as-is, showing \a and \中.

Method 2: Inline Code and Code Blocks

If you have a lot of special symbols to display, escaping each one with backslashes is tedious. Using inline code (wrapped in backticks) or code blocks is much more convenient:

Inline code:

The filename format is `file_name_v2.txt`, and the password is `P@ss#word!`

All content inside inline code is displayed as-is — Markdown won't apply any formatting.

Code blocks:

```javascript
const regex = /[.*+?^${}()|[\]\\]/g;
const price = "$5 - $10";

Special symbols inside code blocks don't need any escaping either. This approach is especially good for showing config files, regular expressions, and code snippets with lots of special characters.

### Method 3: HTML Entities

HTML entities are special encodings that start with `&` and end with `;`, like `&copy;` for ©. Since Markdown is a superset of HTML, all HTML entities work directly in Markdown.

This method is mainly for two scenarios:

1. **Inserting symbols not on your keyboard** (copyright, trademark, math symbols, etc.)
2. **Angle brackets `<` `>` can be unreliable with backslash escaping** in some parsers — `&lt;` and `&gt;` are more consistent

```markdown
Copyright &copy; 2024
Registered trademark &reg;
Less than &lt; greater than &gt;
Ellipsis&hellip;

Rendered output:

Copyright © 2024 / Registered trademark ® / Less than < greater than > / Ellipsis…

Common Symbol Reference Table

Here are the most frequently needed symbols when writing Markdown, organized by category.

Copyright and Trademark Symbols

SymbolHTML EntityUnicodeDescription
©&copy;&#169;Copyright
®&reg;&#174;Registered trademark
&trade;&#8482;Trademark
&#8480;&#8480;Service mark
§&sect;&#167;Section sign

Currency Symbols

SymbolHTML EntityUnicodeDescription
¥&yen;&#165;Yen / Yuan
&euro;&#8364;Euro
£&pound;&#163;Pound
¢&cent;&#162;Cent
$&#36; or \$&#36;Dollar (watch out for math conflicts)

By the way, the dollar sign $ has a gotcha — if your Markdown editor or platform supports LaTeX math (like Obsidian or Jupyter Notebook), $ will be treated as a math delimiter. I once wrote price is $5 - $10 in Obsidian, and the 5 - part got rendered as a math expression, messing up the layout completely. When this happens, either escape it with \$ or wrap the price in inline code `$5 - $10`.

Arrow Symbols

SymbolHTML EntityDescription
&rarr; or &#8594;Right arrow
&larr; or &#8592;Left arrow
&#8596;Left-right arrow
&#8658;Double right arrow
&#8656;Double left arrow
&#8593;Up arrow
&#8595;Down arrow

Math and Logic Symbols

SymbolHTML EntityDescription
±&plusmn;Plus-minus
×&times;Multiplication
÷&divide;Division
&ne;Not equal
&le;Less than or equal
&ge;Greater than or equal
&asymp;Approximately equal
&infin;Infinity
&radic;Square root
&sum;Summation
&prod;Product
&int;Integral
&there4;Therefore
&#8757;Because

Typography Symbols

SymbolHTML EntityDescription
&mdash;Em dash
&ndash;En dash
&hellip;Ellipsis
&bull;Bullet
°&deg;Degree
&permil;Per mille
&prime;Prime (minutes)
&#8243;Double prime (seconds)
&emsp;Em space
&ensp;En space
&nbsp;Non-breaking space

Platform Differences in Symbol Handling

This is something most tutorials don't cover, but it really matters in practice. The same Markdown file may handle symbols differently on different platforms.

GitHub (GFM)

GitHub uses GitHub Flavored Markdown, which extends CommonMark. Most escaping behavior matches CommonMark, with a few differences:

  • The pipe | doesn't need escaping outside of tables
  • Tildes ~ create strikethrough: ~~deleted~~
  • The dollar sign $ is a regular character on GitHub — it won't be treated as a math delimiter (GitHub added math support later, using ```math code block syntax instead)

Obsidian

Obsidian extends Markdown significantly, with some special symbol handling:

  • $ is the default LaTeX inline math delimiter, and $$ is for block math
  • To display a literal $, you must escape it as \$ or use inline code
  • %% is Obsidian's comment marker (doesn't appear in rendered output)

Typora

Typora's behavior is fairly close to CommonMark, but:

  • It supports LaTeX math ($ / $$)
  • Some HTML entities may not display in live preview mode, but work correctly on export

VS Code Preview

VS Code's Markdown preview depends on your installed extensions:

  • The built-in preview follows CommonMark
  • With the Markdown Math extension, $ becomes a math delimiter
  • Check your current preview plugin configuration

My own advice: if your document will be used across multiple platforms, try wrapping special symbols in inline code — it's the most compatible approach. Escape characters work fine on most platforms, but $, ~, and ^ have the biggest differences across platforms, so pay extra attention to those.

When You Don't Need to Escape

Not all special symbols need escaping. In these scenarios, symbols will display as regular characters automatically:

Inside code blocks and inline code, all Markdown syntax is disabled:

The *asterisk* and #hash# in this text will display as-is

Inside HTML tags, Markdown syntax is usually not parsed:

<div>The *asterisk* here won't become italic</div>

When a symbol appears in a position that doesn't trigger formatting, like * in the middle of a sentence without wrapping words, or # not at the start of a line:

This text has a * in the middle that won't be processed
This # is not a heading

That said, this "automatic non-triggering" behavior may not be consistent across different parsers. If you need to guarantee a symbol displays as-is, it's safer to just escape it or wrap it in code.

Common Issues with Special Symbols

Why does --- become a horizontal line?

Three hyphens --- is the Markdown syntax for a horizontal rule <hr>. If you just want to show three hyphens, escape the first one: \---, or use inline code `---`.

How to display a pipe character in a table?

Table syntax uses | as column separators. If you need to show a pipe inside table content, use &#124; (the HTML entity for pipe):

| Symbol | How to write |
|--------|-------------|
| Pipe | &#124; |

Why does content after < and > disappear?

Angle brackets have a dual role in Markdown — they mark HTML tags and can trigger autolinks. If what you write isn't a valid HTML tag, the content might get swallowed. Using &lt; and &gt; is the safest approach.

Why do multiple spaces collapse into one?

Markdown (and HTML) collapses consecutive spaces into a single space. If you need to preserve multiple spaces:

  • Use &nbsp; (non-breaking space) instead of regular spaces
  • Use full-width spaces (from CJK input methods)
  • Put them in inline code: `multiple spaces`

What about symbol conflicts in math formulas?

If your platform supports LaTeX math ($...$), be careful when writing prices or ranges that contain $. Something like $5-$10 will be incorrectly parsed on platforms with math support. Solutions:

  1. Escape with backslash: \$5-\$10
  2. Wrap in inline code: `$5 - $10`
  3. Use HTML entity: &#36;5 - &#36;10

References