</>
Skip to content
HTML lessons (33/60)

HTML — Charset

What is a charset and why it matters

When you write HTML, you are really writing a series of characters – letters, numbers, symbols, and even emojis.
The browser needs to know how those characters are stored in the file.
That “how” is called the character set (or charset for short).

If the browser guesses the wrong charset, the page can look garbled, show weird symbols, or break the layout.
This lesson shows you how to tell the browser the correct charset, so every character you typed appears exactly as you intended.

The default charset in modern browsers

Since 2014, most browsers assume UTF‑8 if nothing else is specified.
UTF‑8 is a universal charset that can represent every character in the Unicode standard, including the emojis you learned about in the previous lesson.

However, relying on the default is risky for two reasons:

  1. Older browsers or special environments may still fall back to ISO‑8859‑1.
  2. Search‑engine crawlers and validators look for an explicit declaration.

Declaring the charset in HTML

The most common way is the <meta> element placed inside the <head> of the document.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>My first page</title>
</head>
<body>
  Hello, world!
</body>
</html>

What the browser displays

The page shows the text “Hello, world!” exactly as typed.

Why the <meta charset> tag is preferred over older syntax

In the early days developers used a longer form:

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

This works, but it mixes two responsibilities (content type and charset) into one attribute, making it harder to read.
The short <meta charset="..."> syntax is cleaner and is the standard recommended by the HTML Living Standard.

Good to know: The <meta charset> tag must appear inside the <head> and before any content that might contain non‑ASCII characters.

Using other charsets (when you really need them)

Most new projects stick with UTF‑8, but sometimes you have to work with legacy data that uses a different encoding, such as ISO‑8859‑1 (Western European) or Windows‑1252.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="ISO-8859-1">
  <title>Legacy page</title>
</head>
<body>
  Café – note the accented “é”
</body>
</html>

What the browser displays

The word “Café” appears with the correct accented “e”. If the file were saved in UTF‑8 but declared as ISO‑8859‑1, the “é” would turn into � or another wrong symbol.

How to tell the server about the charset (HTTP header)

Browsers also look at the Content‑Type HTTP header that the server sends.
If the header includes a charset, it overrides the <meta> tag.

Example of a header line:

Content-Type: text/html; charset=UTF-8

If you control the server (e.g., Apache, Nginx, Node.js), you can configure it to always send UTF‑8.

Apache example

AddDefaultCharset UTF-8

Nginx example

charset utf-8;

Common mistake: Forgetting to set the charset on the server. The browser may still use the <meta> tag, but some crawlers ignore it.

Testing your charset with emojis

Emojis are a great way to verify that UTF‑8 is working, because they live outside the old 8‑bit charsets.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Emoji test</title>
</head>
<body>
  <p>Smile 😊, heart ❤️, rocket 🚀</p>
</body>
</html>

What the browser displays

The paragraph shows three emojis: a smiley face, a red heart, and a rocket.

Comparing common charsets

Charset nameBits per characterCan store emojis?Typical use case
UTF‑81‑4✅ YesModern web, all languages
ISO‑8859‑18❌ NoLegacy Western European sites
Windows‑12528❌ NoOlder Windows pages
UTF‑1616‑32✅ YesSome Windows applications, not common on the web

Quick checklist for proper charset handling

  1. Save your HTML file as UTF‑8 in your editor. Most editors have an option like “Encoding → UTF-8”.
  2. Place <meta charset="UTF-8"> as the first element inside <head>.
  3. If you control the server, configure it to send Content-Type: text/html; charset=UTF-8.
  4. Test with characters outside ASCII (e.g., é, ñ, emojis).
  5. Validate the page with the W3C validator; it will warn if charset is missing or mismatched.

Common mistakes checklist

  • Forgot to save the file in UTF‑8.
  • Placed the <meta charset> tag after body content.
  • Declared a charset that doesn’t match the file’s actual encoding.
  • Ignored the server’s Content-Type header.
  • Used the old http‑equiv syntax without need.

Mini Practice

  1. Create a new HTML file, save it as UTF‑8, and add a <meta charset="UTF-8"> tag. Write a paragraph that includes the word “café” and an emoji. Open it in a browser and verify the display.
  2. Change the charset declaration to ISO-8859-1 while keeping the file saved as UTF‑8. Refresh the page and note what happens to the accented “é” and the emoji.
  3. Add an HTTP header (you can simulate it with a local server like python -m http.server) that forces charset=UTF-8. Remove the <meta charset> tag from the file. Does the page still show correctly?
  4. Use the Apache AddDefaultCharset directive (or the Nginx charset directive) to set UTF‑8 for all pages in a folder. Create two simple pages, one with only ASCII text and one with Chinese characters. Verify both render properly.
  5. Fill the table below with a charset you haven’t used yet (e.g., UTF‑16). Include bits per character, emoji support, and a typical use case.
Charset nameBits per characterCan store emojis?Typical use case
UTF-16

Related Topics

Frequently Asked Questions about Charset

What is Charset in HTML?

Charset is a fundamental concept in HTML. This lesson explains it step by step with clear examples, making it easy for beginners to understand.

How do I learn Charset?

Start by reading the explanation above, then try the code examples. Practice by modifying the examples and experimenting with different values. Hands-on practice is the best way to learn Charset.

Why is Charset important in HTML?

Charset is essential for HTML development. Understanding this concept will help you write better code and solve real-world problems more effectively.