Changing UTF-8 in Windows usually means converting a local text file that was saved in another encoding into properly formed, BOM-free UTF-8 bytes. Windows still ships many legacy applications, console scripts, and PowerShell pipelines that default to single-byte code pages such as Windows-1252 or GBK, and even older builds of Notepad produced UTF-16 little-endian files by default. When one of those files is opened on a server, a web service, or another application that strictly expects UTF-8, names, punctuation, and non-ASCII symbols can silently become replacement characters or mojibake. The reliable fix is not to retype the text but to decode the bytes with the encoding that actually produced the file and then re-encode the result as UTF-8. The UTF-8 Converter does exactly that: it reads your file locally in the browser, decodes the bytes against the encoding you select, validates the result with fatal error handling, and exports a downloadable UTF-8 file that consumes any source byte-order mark rather than copying it through.

Why guessing the source encoding fails on Windows
Windows text files are a particular trap because the same byte sequence can mean different characters depending on which code page produced it. The byte 0x80 is a non-printable control character in ISO-8859-1 but represents the euro sign (€) in Windows-1252. A pair of bytes that look like readable letters in UTF-16 little-endian can become nonsense in UTF-16 big-endian once the byte order is reversed, even though the bytes themselves still fall in the printable ASCII range. Tools that claim to detect an encoding rely on statistical heuristics over the byte stream, and those heuristics are probabilistic: they can return a confident-looking but wrong answer for short files, for files dominated by ASCII, or for files that mix ASCII punctuation with a few accented names. The cost of guessing wrong is silent corruption, and there is often no replacement-character warning to alert you that a Windows-1252 euro byte such as 0x80 has been turned into a non-printable control character. The safe workflow is to determine the source encoding from the producing application's settings or from reliable metadata, then declare it explicitly to a converter. Keeping the choice explicit makes the transformation auditable: if the preview shows the right characters, you know which decoder produced them, and the conversion can be reproduced or reversed later.
Encodings the converter accepts
The UTF-8 Converter accepts four source encodings and re-emits UTF-8 in every case, so the mode you select has to match the file rather than the appearance of the text. The table below summarises each supported source encoding, the kind of Windows file it typically comes from, and the specific quirk that gets introduced when it is confused with another encoding.
| Source encoding | Typical Windows source | Detail to watch for |
|---|---|---|
| UTF-8 | Modern editors, web exports, validated databases | Use this mode to validate byte sequences and strip an unwanted BOM |
| UTF-16 little-endian | PowerShell Out-File, older Notepad builds, Windows clipboard text | First two bytes are FF FE; swapping with UTF-16BE garbles every character |
| UTF-16 big-endian | Cross-platform exports and Java tooling on Windows | First two bytes are FE FF; round-trips losslessly only when the same endian is selected |
| Windows-1252 | Legacy Western European text, classic ANSI files, regional console output | Bytes 80 to 9F include the euro sign and curly quotation marks that ISO-8859-1 leaves undefined |
The simplest case is UTF-8 itself: a file that is already UTF-8 can be passed through the converter to validate the byte sequences and strip a stray byte-order mark. UTF-16 little-endian is the format that PowerShell Out-File and many older Notepad builds produce by default, and its first two bytes are typically FF FE in that order. UTF-16 big-endian swaps the pair to FE FF and is mostly seen in files exported from non-Windows systems or from cross-platform tooling. Windows-1252 is the legacy Western code page that is widely mislabelled ISO-8859-1 in older Windows applications; bytes in the 0x80 to 0x9F range, which are non-printable in ISO-8859-1, include the euro sign and the curly quotation marks in Windows-1252, and the standards-based Windows-1252 decoder supplied by the browser supplies those mappings before UTF-8 re-encoding.
How to convert a file to UTF-8 on Windows
Once the source encoding is known, converting a Windows text file to UTF-8 is a matter of selecting the file, picking the right decoder, and reviewing the preview before downloading.
- Identify the source encoding from the producing application or any reliable metadata about the file.
- Open the UTF-8 Converter in your browser.
- Select the source encoding (UTF-8, UTF-16LE, UTF-16BE, or Windows-1252) that matches the file.
- Choose the text file (up to 10 MB) from your local disk using the file picker.
- Convert the file and inspect the preview, focusing on names, punctuation, and currency symbols that exercise the non-ASCII range.
- Download the resulting UTF-8 file. The browser appends -utf8 to the filename and serves it as a plain-text UTF-8 file without a BOM.
- Open the downloaded file in the destination application and confirm that the characters render correctly.
- Keep the original file until the full workflow has been verified end to end.
Reading byte order, BOMs and surrogate pairs
Three small details explain why a UTF-16 file ends up garbled even though its bytes look printable, and why the converter treats them carefully rather than guessing.
Byte order matters for every UTF-16 file because each character is stored as two bytes in a specific order. UTF-16LE stores the low byte first and UTF-16BE stores the high byte first; the letters in a file can become nonsense if the endian order is reversed even though the byte pairs remain readable as ASCII ranges. A matching byte-order mark is recognised on read and consumed by the standards-based decoder, so the source BOM does not appear in the downloaded UTF-8 output and no new BOM is added either. The browser-side encoder, defined by the WHATWG Encoding Standard, emits clean UTF-8 bytes from the decoded characters.
Supplementary characters such as emoji or historic scripts live outside the Basic Multilingual Plane and are encoded as UTF-16 surrogate pairs. The decoder combines a valid high and low surrogate into one Unicode scalar value before the UTF-8 output is produced. Unpaired or malformed sequences are rejected under fatal decoding rather than silently emitted as replacement diamonds, so a partial UTF-16 file produces a clear failure instead of a "successful" download of corrupted text. Invalid continuation bytes, truncated sequences, and forbidden encodings all trigger the same fatal behaviour, which keeps the transformation honest.
Verifying the converted file before replacing the original
A successful download is not the same as a correct conversion. Treat the downloaded UTF-8 file as a candidate and confirm that it actually works in the destination application before deleting the original file.
The page reports the source byte count and the output byte count side by side after conversion, so any expansion or contraction is visible. Different counts are expected and do not by themselves indicate data loss: a Windows-1252 euro byte 0x80 becomes the three UTF-8 bytes E2 82 AC, while an ASCII-heavy file barely changes size at all. The preview helps catch an obviously wrong selection before download, but it may not display every control character or every normalisation difference, so inspect representative names, punctuation, currency symbols, and non-ASCII lines manually. If the source contains mixed encodings inside one file, a single decoder cannot repair it reliably and the conversion should be repeated on each clean section instead. Changing the file or source encoding cancels the visible result and invalidates the prior download URL, because each new choice receives its own job identity and the previous object URL is revoked. That behaviour is intentional: it stops a slower read of an older file from silently replacing a newer choice.
When the 10 MB limit and mixed encodings push you elsewhere
The converter runs in the browser using the File and Encoding interfaces on an in-memory buffer, and the size is checked before reading to avoid loading an unexpectedly large file. The 10 MB ceiling covers typical configuration files, scripts, CSV exports, log excerpts, and email archives that need their encoding changed once. For database dumps or multi-gigabyte logs you should reach for a trusted streaming conversion utility with explicit source and destination encodings instead, because loading those files into a browser tab will simply fail.
Files that combine multiple encodings inside one buffer are also out of scope: there is no single source encoding to declare, and any single decoder will corrupt the sections that were not produced by it. Split the file along the boundary you can identify, run each section through the converter with its matching source encoding, and rejoin the pieces afterwards. The downloaded filename adds -utf8 and uses a plain-text UTF-8 media type, which is what most web servers and modern editors expect. Eight external fixtures in the underlying implementation cover ASCII UTF-8, multibyte UTF-8, UTF-8 BOM handling, both UTF-16 byte orders with emoji, both UTF-16 BOMs, and Windows-1252 punctuation; tests compare exact decoded text and exact re-encoded UTF-8 bytes, while malformed UTF-8 must fail. If a tool that claims to detect encoding returns a confident-looking result for one of those fixtures, it is probably guessing rather than verifying, and you should switch to an explicit decoder like this one.
For a deeper look, see How to Convert Unicode Text with a UTF-8 Encoder.