This page can be used to see how a Markdown parser creates IDs for different headers.
Note that GitHub's parser drops the . characters from the ID.
The presence of code font and an apostrophe may trip up some parsers.
Does the entire path get mashed into a single run-on word?
Single underscore—does it stay or does it go?
Formatting probably doesn't contribute to the header text?
How do you link that "n>1" header, anyway? Turns out on GitHub it's #n1.
How does your parser handle a mix of English and Japanese characters? This is common in pages written in Japanese.
What about a title written entirely in Japanese? If your parser strips out non-ASCII characters, this might become an empty ID. Unicode-aware parsers make the text into an ID that's almost an exact match for the header.
Using a single poo emoji as the header actually breaks in the GitHub parser as of 2025-08-13 (and going back several years at least). It generates an empty string as the ID, which is technically invalid HTML and also means that clicking the permalink takes you to the top of the page.
Not all parsers treat all emoji the same. This header ("1 BOOK" using a mix of emoji) may end up with a non-empty string.
What if you were, say, trying to differentiate text for residents of different countries by adding flags to headers? Would the IDs be different per flag?
This one is the same as the previous, but using the flag of Germany instead of the USA. But how do the IDs come out?
How does your parser handle accent marks?
Zalgo text pushes Unicode formatting marks to an extreme.
Repeated headers should have unique IDs. But do they?
In GitHub's parser, the second instance of this header has -1 appended to its ID.
The third instance has -2 appended.
Similar things happen when the repeated header is entirely in Japanese.
... again.