ISO-8859-1, better known as Latin-1, is the most literal of the legacy encodings: every byte is simply the Unicode codepoint of the same value. This tool encodes text to Latin-1 hex and decodes it back.
Why Latin-1 is uniquely simple
Most character encodings require a lookup table because there is no arithmetic relationship between a character and its byte. Latin-1 is different. When Unicode was designed in the early 1990s, its creators deliberately aligned the first 256 code points with ISO-8859-1 so that existing Latin-1 text would be valid Unicode without any conversion. The result is that Latin-1 encoding and decoding is a pure identity map — no lookup, no arithmetic beyond reading the codepoint value:
encode : codepoint → byte (only valid for U+0000 to U+00FF)
decode : byte → codepoint of the same value
Any character above U+00FF has no Latin-1 byte and is reported as skipped.
What Latin-1 covers and what it misses
Latin-1 spans two ranges:
- U+0000–U+007F — standard ASCII: letters, digits, punctuation, control codes.
- U+0080–U+00FF — Western European characters: accented letters like
é(0xE9),ñ(0xF1),ü(0xFC),ø(0xF8),ç(0xE7), and currency symbols like¥(0xA5) and£(0xA3).
Characters that do not fit in Latin-1 (and are skipped by the encoder):
€— Euro sign (U+20AC, above 0xFF)—— em dash (U+2014)""— curly quotes (U+201C, U+201D)- Any emoji, CJK character, or other non-Latin script
If your text contains these, you need UTF-8, which can encode all of Unicode, or Windows-1252 if you specifically need a single-byte encoding that includes the Euro sign.
Common real-world scenarios
Debugging legacy database output. Older databases configured with CHARSET=latin1
(a common MySQL default) store Western European text correctly, but output that
gets misread as UTF-8 produces mojibake — for example, é appearing as é.
Paste the raw bytes here to see what the Latin-1 values actually are.
HTTP and email headers. HTTP/1.1 specifies ISO-8859-1 as the default charset for text media types when no encoding is declared. Seeing garbled characters in an old web response or email is often a Latin-1 vs UTF-8 mismatch.
C and embedded systems. Legacy C code frequently uses unsigned char arrays
where each byte is a Latin-1 character. Encoding a string to Latin-1 hex lets
you inspect or initialise those arrays directly.
Latin-1 vs Windows-1252
They are almost identical: bytes 0x00–0x7F and 0xA0–0xFF are the same
in both. The difference is the range 0x80–0x9F:
| Range | Latin-1 | Windows-1252 |
|---|---|---|
| 0x80–0x9F | Reserved control codes | Printable symbols (€, —, ”, ” etc.) |
Web browsers historically treated any page declared as iso-8859-1 as if it
were Windows-1252, since almost nobody actually meant the control-code range.
This created long-running confusion. If you see a Euro sign or curly quotes in
your source, the encoding is almost certainly Windows-1252, not true Latin-1.