UnicodeEncodeError in Python: Causes and Fixes
UnicodeEncodeError happens when Python tries to convert text into bytes, but the target encoding cannot represent one or more characters.
This often appears when:
- writing text to a file
- printing text to a terminal
- sending text to another system
- calling
.encode()with the wrong encoding
For beginners, the fastest fix is usually to use UTF-8 explicitly.
Quick fix #
text = "café ☕"
with open("output.txt", "w", encoding="utf-8") as file:
file.write(text)
Most fixes start by using UTF-8 explicitly. The error often happens when Python uses a narrower encoding like ascii or cp1252.
What this error means #
UnicodeEncodeError happens when Python tries to turn a string into bytes using an encoding that cannot represent one or more characters.
A few important ideas:
- A Python
strstores text as Unicode characters. - An encoding is the rule used to save or send that text as bytes.
- Not every encoding supports every character.
- The error message usually tells you:
- which encoding Python tried to use
- which character caused the problem
For example, this text contains characters outside plain ASCII:
é☕
If Python tries to save that text using ascii, it fails because ASCII only supports a small set of characters.
If you need a refresher on text values in Python, see Python strings explained.
When this error usually happens #
This error commonly appears in these situations:
- Writing text to a file without setting
encoding - Printing text to a terminal that does not support the character
- Sending text to an API, socket, or external tool with the wrong encoding
- Calling
.encode()with a limited encoding such asascii
A very common beginner mistake is assuming Python will always pick the right encoding automatically. Sometimes it does, but sometimes it uses the system default instead.
Example that causes the error #
Here is a simple example that raises UnicodeEncodeError:
text = "café ☕"
data = text.encode("ascii")
print(data)
Output:
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 3: ordinal not in range(128)
Why this fails:
textis a Python string.encode("ascii")tries to convert it to bytes using ASCII- ASCII cannot represent
éor☕ - Python raises
UnicodeEncodeError
Here is the same idea with a character that ASCII can handle:
text = "cafe"
data = text.encode("ascii")
print(data)
Output:
b'cafe'
That works because all characters are valid in ASCII.
How to fix it #
Use UTF-8 when opening files #
When writing text files, explicitly set the encoding.
text = "café ☕"
with open("output.txt", "w", encoding="utf-8") as file:
file.write(text)
This is the safest default for most modern Python programs.
If you want to learn more about file handling, see how to write to a file in Python and the Python open() function explained.
Use UTF-8 with encode() #
If you need bytes, use UTF-8 unless another system requires something else.
text = "café ☕"
data = text.encode("utf-8")
print(data)
Output:
b'caf\xc3\xa9 \xe2\x98\x95'
This works because UTF-8 can represent these characters.
Choose the correct encoding for the destination #
Sometimes you must match another system.
For example, a tool or file format may require a specific encoding such as cp1252 or latin-1. In that case, use the encoding that system expects, but make sure it supports your characters.
text = "café"
data = text.encode("cp1252")
print(data)
This works because cp1252 supports é.
But this fails:
text = "café ☕"
data = text.encode("cp1252")
print(data)
The coffee cup character is not available in cp1252.
Use errors='ignore' or errors='replace' carefully #
If you cannot preserve all characters, Python lets you skip or replace unsupported ones.
text = "café ☕"
print(text.encode("ascii", errors="ignore"))
print(text.encode("ascii", errors="replace"))
Output:
b'caf '
b'caf? ?'
Be careful:
ignoresilently removes charactersreplacechanges characters, usually to?
These options can be useful, but they may lose data. It is better to use the correct encoding first.
Check terminal or editor encoding #
Sometimes the error happens during print() instead of file writing.
text = "café ☕"
print(text)
If this raises UnicodeEncodeError, the problem may be your terminal output encoding, not your string.
In that case:
- check your terminal settings
- check Python’s stdout encoding
- try running in a UTF-8 terminal
- make sure your editor and environment are using UTF-8
How to debug the problem #
When you see this error, use a simple process.
1. Read the full error message #
Look for:
- the encoding name, such as
ascii - the character that failed
- the position where it happened
That tells you what Python was trying to do.
2. Find where Python is converting text to bytes #
Look for code like:
text.encode(...)open(..., "w")withoutencoding=...print(...)in a limited terminal- library calls that send text to another system
3. Inspect the text #
If the problem is hard to see, print the text with repr().
text = "café ☕"
print(repr(text))
Output:
'café ☕'
This helps you spot hidden characters such as \n, \t, or unexpected Unicode characters.
4. Check file operations #
If you are writing a file, review your open() call.
Bad:
with open("output.txt", "w") as file:
file.write("café ☕")
Better:
with open("output.txt", "w", encoding="utf-8") as file:
file.write("café ☕")
If you also read text from files, see how to read a file in Python.
5. Check explicit .encode() calls #
If you wrote something like this:
text.encode("ascii")
ask yourself:
- Do I really need ASCII?
- Should this be UTF-8 instead?
- Does the other system require a specific encoding?
Safe beginner guidance #
For most modern Python code, these rules are safe and practical:
- Use UTF-8 as your default encoding
- Do not mix
strandbytesunless you understand the difference - Keep track of encoding from input to output
- Avoid using
asciiunless you specifically need it
A useful mental model:
str= textbytes= raw binary data- encoding = turning text into bytes
- decoding = turning bytes into text
If you want to understand Python errors more generally, see Python errors and exceptions explained.
Common mistakes #
These are common causes of UnicodeEncodeError:
- Using
text.encode('ascii')on text that contains accented letters or emoji - Writing a file without
encoding='utf-8' - Running Python in a terminal with a limited default encoding
- Passing text to a library or tool that expects a different encoding
- Confusing
strobjects withbytesobjects
Useful commands for debugging #
These commands can help you inspect your Python environment.
Check your Python version:
python --version
Check your terminal output encoding:
python -c "import sys; print(sys.stdout.encoding)"
Check your system’s preferred encoding:
python -c "import locale; print(locale.getpreferredencoding(False))"
Test a Unicode string and UTF-8 encoding:
python -c "text='café ☕'; print(repr(text)); print(text.encode('utf-8'))"
FAQ #
What is the difference between UnicodeEncodeError and UnicodeDecodeError? #
UnicodeEncodeError happens when Python turns text into bytes.
UnicodeDecodeError happens when Python turns bytes into text.
If that is your problem instead, see UnicodeDecodeError: utf-8 codec can’t decode byte.
Why does this happen only on some computers? #
Different systems and terminals may use different default encodings.
One machine may default to UTF-8, while another uses a more limited encoding. That is why the same code may work on one computer and fail on another.
Should I always use UTF-8? #
Usually yes.
UTF-8 is the safest default for modern Python code unless you must match a specific external format.
Can I fix this with errors='ignore'? #
Yes, but it can silently remove characters.
It is better to use the correct encoding first.