Hex to UTF-8 Converter

Decodes space-separated or contiguous hex bytes as UTF-8 text using a strict TextDecoder, correctly reconstructing multi-byte characters like accented letters and emoji, and rejecting byte sequences that aren't valid UTF-8 instead of silently producing replacement characters. A free online tool from Staaarter, right in your browser.

Runs locallyUpdated 2026-07-26

Overview

Introduction

UTF-8's variable-width encoding means a hex-dumped byte sequence can't always be decoded one byte at a time; some characters span 2, 3, or 4 bytes that only make sense together.

This tool decodes hex bytes as real UTF-8 text using the browser's standards-compliant decoder, and rejects malformed byte sequences outright instead of masking them with replacement characters.

What Is Hex to UTF-8 Converter?

A hex-to-text decoder built on the standard `TextDecoder` API in strict ("fatal") mode, which correctly reconstructs multi-byte UTF-8 characters and throws on invalid input rather than guessing.

It's the direct inverse of UTF-8 to Hex Converter, and the UTF-8-aware counterpart to Hex to ASCII Converter, which only handles single-byte 7-bit values.

How Hex to UTF-8 Converter Works

Whitespace is stripped from the input, the remaining string is validated as hex digits with an even digit count, then split into 2-digit byte pairs and loaded into a `Uint8Array`.

That byte array is passed to `new TextDecoder("utf-8", { fatal: true }).decode(bytes)`, which reconstructs each UTF-8 character (spanning 1 to 4 bytes as needed) or throws if any byte sequence is malformed, which is caught and reported as a clear error.

When To Use Hex to UTF-8 Converter

Use it to decode hex-dumped text that may contain non-ASCII characters, such as UTF-8 bytes captured from an HTTP body, file, or network payload.

If you already know the bytes are pure 7-bit ASCII and want that strictly enforced, Hex to ASCII Converter is a slightly more specific tool for that narrower case.

Features

Advantages

  • Correctly decodes the full range of UTF-8, including multi-byte characters outside the Basic Multilingual Plane like most emoji.
  • Fails loudly on invalid or truncated byte sequences instead of silently inserting replacement characters that could hide a real problem.
  • Accepts both space-separated and contiguous hex, so pasted hex dumps don't need reformatting first.

Limitations

  • Only decodes UTF-8; hex bytes representing UTF-16 or another encoding will either decode incorrectly or be rejected as invalid UTF-8.
  • Requires an even number of hex digits per byte; a dangling half-byte is treated as a formatting error rather than silently dropped.

Examples

Decoding a 2-byte UTF-8 sequence

Input

C3 A9

Output

é

C3 A9 is the standard UTF-8 encoding of U+00E9 ("é"), so it decodes back to that single character.

Decoding a 4-byte UTF-8 sequence

Input

F0 9F 8C 8D

Output

🌍

These 4 bytes together form the UTF-8 encoding of U+1F30D, the Earth globe emoji.

Rejecting a truncated multi-byte sequence

Input

C3

Output

Error: these hex bytes aren't valid UTF-8

0xC3 is a lead byte that signals a 2-byte sequence, but there's no continuation byte, so the sequence is incomplete and invalid.

Best Practices & Notes

Best Practices

  • If decoding fails, check for a truncated hex dump first; a common cause is copying only part of a multi-byte character's bytes.
  • For hex you're confident is pure ASCII, Hex to ASCII Converter gives the same result plus an explicit guarantee no byte exceeds 0x7F.

Developer Notes

Implemented with `new TextDecoder("utf-8", { fatal: true }).decode(bytes)` wrapped in a try/catch; the `fatal: true` option is what makes the decoder throw on invalid sequences instead of the default behavior of substituting U+FFFD replacement characters.

Hex to UTF-8 Converter Use Cases

  • Decoding UTF-8 text from a hex-dumped network packet, file, or HTTP payload
  • Verifying a UTF-8 to Hex Converter round trip during testing
  • Diagnosing whether a suspicious hex byte sequence is actually valid UTF-8 at all

Common Mistakes

  • Assuming any hex string will decode to something readable; genuinely invalid or truncated UTF-8 byte sequences are correctly rejected, not guessed at.
  • Mixing up byte order when manually constructing a multi-byte sequence, which produces an invalid continuation-byte pattern.

Tips

  • Round-trip through UTF-8 to Hex Converter with the decoded text to confirm you get the original hex bytes back.
  • If you only expect ASCII and want that enforced rather than allowing multi-byte characters, use Hex to ASCII Converter instead.

References

Frequently Asked Questions