diff --git a/src/mfm/language.ts b/src/mfm/language.ts
index 5d5e35fbfd901086b8b7b98e894e8d0917332d00..53c275342b6f90a327724825f4002bb835c52655 100644
--- a/src/mfm/language.ts
+++ b/src/mfm/language.ts
@@ -145,6 +145,7 @@ export const mfmLanguage = P.createLanguage({
 		if (!match) return P.makeFailure(i, 'not a hashtag');
 		let hashtag = match[1];
 		hashtag = removeOrphanedBrackets(hashtag);
+		if (hashtag.match(/^(\u20e3|\ufe0f)/)) return P.makeFailure(i, 'not a hashtag');
 		if (hashtag.match(/^[0-9]+$/)) return P.makeFailure(i, 'not a hashtag');
 		if (input[i - 1] != null && input[i - 1].match(/[a-z0-9]/i)) return P.makeFailure(i, 'not a hashtag');
 		if (hashtag.length > 50) return P.makeFailure(i, 'not a hashtag');
diff --git a/test/mfm.ts b/test/mfm.ts
index 03d9f593af6ccf06a34023e381668dd85190dea8..12d9563e58398562f5208ee59970a02b17b3e1f8 100644
--- a/test/mfm.ts
+++ b/test/mfm.ts
@@ -639,6 +639,20 @@ describe('MFM', () => {
 					text('/bar'),
 				]);
 			});
+
+			it('ignore Keycap Number Sign (U+0023 + U+20E3)', () => {
+				const tokens = parse('#⃣');
+				assert.deepStrictEqual(tokens, [
+					leaf('emoji', { emoji: '#⃣' })
+				]);
+			});
+
+			it('ignore Keycap Number Sign (U+0023 + U+FE0F + U+20E3)', () => {
+				const tokens = parse('#️⃣');
+				assert.deepStrictEqual(tokens, [
+					leaf('emoji', { emoji: '#️⃣' })
+				]);
+			});
 		});
 
 		describe('quote', () => {