Character encoding is declared
Why it matters
Without a declared charset, browsers fall back to heuristics — usually Windows-1252 or Latin-1 on legacy configs — and render multi-byte UTF-8 content as mojibake. Smart quotes, em dashes, emoji, and non-English characters turn into garbage sequences like ’ or é. The Google crawler follows the same fallback and indexes the corrupted text, which then shows up in search results. This is also a minor XSS signal: ambiguous encoding lets attackers smuggle script tags through characters the browser misinterprets.
Severity rationale
Medium because modern frameworks usually inject it automatically, but when missing it breaks rendering and indexing immediately.
Remediation
Most frameworks emit <meta charset="utf-8"> by default — Next.js, Remix, Astro, and Vite-based apps all do. If you are on a custom HTML template or Express-rendered view, add the tag as the first element inside <head> so the browser switches before parsing any content.
// app/layout.tsx or equivalent root template
<head>
<meta charSet="utf-8" />
</head>
Verify via curl -I that responses also include Content-Type: text/html; charset=utf-8.
DetectionPro
The detection method for this pattern is part of AuditBuffet Pro.
The full method (what to look for, pass and fail conditions, and how results get reported) ships inside the SEO Fundamentals Audit. The pattern definition, severity rationale, and remediation remain openly licensed under CC-BY-4.0.
Taxons
History
- 2026-04-18·v1.0.0·Initial import from seo-fundamentals·automated