Hex to UTF-16 Converter
Decode hex bytes as UTF-16 text (big-endian, 2 bytes per code unit) — the internal string format JavaScript, Java, and Windows all use.
How Hex to UTF-16 Decoding Works
Group the hex bytes into pairs (2 bytes = 16 bits = 1 code unit), read each pair as a big-endian number, and treat it as either a standalone character (for most text) or half of a surrogate pair (for characters above U+FFFF, like most emoji).
Hex to UTF-16 Example, Step by Step
D83DDE00 = 😀
D83DDE00 (hex) = 😀 (UTF-16 surrogate pair)
D83D = high surrogate (in range D800-DBFF) DE00 = low surrogate (in range DC00-DFFF) Together they decode to U+1F600
| Step | Description | Result |
|---|---|---|
| Read first code unit | D83D falls in the high-surrogate range | high surrogate |
| Read second code unit | DE00 falls in the low-surrogate range | low surrogate |
| Combine the pair | high + low surrogate decode to U+1F600 | 😀 |
Plain characters below U+FFFF need only one code unit — surrogate pairs only come up for the less common characters above that range.
Common Mistakes When Decoding Hex to UTF-16
- Grouping bytes in the wrong pairs, which misaligns every code unit after the first.
- Treating a lone surrogate half as a standalone character instead of pairing it.
- Mixing up big-endian and little-endian byte order, which produces garbled output.
Frequently Asked Questions
How is UTF-16 different from UTF-8?
UTF-16 uses 2 bytes per code unit as its baseline (versus UTF-8's 1-byte baseline), and represents characters above U+FFFF using a pair of 2-byte surrogate code units instead of a single longer unit.
Is this big-endian or little-endian UTF-16?
Big-endian (UTF-16BE) — the more common convention for displaying UTF-16 as hex. Windows internally often uses little-endian (UTF-16LE); swap each byte pair if you're working with that instead.
What's a surrogate pair?
Two 16-bit code units (4 bytes total) that together represent one character above U+FFFF, like most emoji. Neither unit is a valid character on its own — they only mean something as a pair.
Why does plain English text take twice as many bytes as UTF-8?
Because UTF-16's minimum unit is 2 bytes even for characters UTF-8 would fit in 1 — 'A' is 0x41 in UTF-8 but 0x0041 in UTF-16.
Where is UTF-16 actually used?
It's the native internal string representation in JavaScript, Java, and Windows (UTF-16LE specifically) — this converter is useful for reading raw string data from those environments.
What happens with an odd number of hex digits?
The calculator flags it — UTF-16 needs exactly 2 bytes per code unit, so an odd byte count means a digit is missing somewhere.