str.isascii()
Check that a string contains only ASCII characters — the odd one out of the is* family, since it returns True on empty.
Common call
if user_input.isascii():
Returns
True or False
Replaces
a manual `all(ord(c) < 128 for c in s)` loop
Watch out
EMPTY STRING RETURNS TRUE — the entire is* family says False on empty EXCEPT this one
str.isascii()
→ bool
Demo
Live evaluation
Try:
Inputs
stringstrthe string to test
Output
'hello world'.isascii()
True
isascii() returns True only when every character has a Unicode codepoint below 128 — the ASCII range (0..127). Digits, letters A-Z / a-z, and standard punctuation all pass. Accented letters (é, ñ), Cyrillic (П), CJK (漢), and emoji all fail. THE EXCEPTION worth remembering: empty string returns True. Every other is* method returns False on empty.
Common patterns
Validate ASCII-only input
Use before writing to an ASCII-only field (some legacy databases, some protocols).
if not username.isascii(): raise ValueError("username must be ASCII")
Combine with isalnum for "ASCII alphanumeric"
A stricter version of isalnum that excludes non-Latin letters and digits.
if s.isascii() and s.isalnum(): ... # ASCII letters and digits only
Detect non-ASCII content for encoding decisions
Fast path: skip charset detection or encoding conversion if the whole string is ASCII.
if payload.isascii(): write_plain(payload) else: write_utf8(payload)
Examples
1. Plain ASCII
"hello".isascii()
Returns
True2. Digits and punct
"a-b_c.d".isascii()
Returns
True3. Accented letter
"café".isascii()
Returns
False4. Emoji
"hi 😀".isascii()
Returns
False5. Cyrillic
"Привет".isascii()
Returns
False6. Empty is TRUE
"".isascii()
Returns
True # the odd one outPitfalls
1. Empty string returns TRUE — the exception to the family
Every other is* method (isalpha, isdigit, isalnum, isspace, isupper, islower, ...) returns False on empty. isascii is the exception: it returns True. The reason is that all zero characters trivially satisfy "every character is ASCII".
Assumed False
"".isascii()
True # UNLIKE the rest of is*
Guard if you need non-empty
s and s.isascii()
True only for non-empty ASCII
2. ASCII includes control characters
Codepoints 0..31 (control chars like NUL, TAB, LF, ESC) and 127 (DEL) are all ASCII. isascii returns True on strings that contain these — legitimate but unlikely to be what a validator wants.
Contains control char
"hello\x00world".isascii()
True # NUL is ASCII
Combine with isprintable
s.isascii() and s.isprintable()
False on NUL
3. NOT the same as "in the Latin alphabet"
isascii tests the CODEPOINT range, not whether characters are Latin letters. Punctuation, digits, spaces, and control characters all pass; anything above U+007F fails.
Assumed alphabet
"12345".isascii()
True # digits are ASCII
Combine with isalpha
s.isascii() and s.isalpha()
True only for ASCII letters
4. Some visually similar characters are NOT ASCII
The look-alike attack surface: fancy quotes (“”), en/em dashes (– —), non-breaking space (U+00A0), fullwidth digits (123). None are ASCII. Input that looks ASCII may not be.
Fancy quote fails
"hello “world”".isascii()
False # curly quotes are not ASCII
Normalize first
s = s.replace("\u201c", chr(0x22)).replace("\u201d", chr(0x22)) s.isascii()
True after normalization
When to use
Use it
- Fast pre-check before ASCII-only encoding or storage
- Detecting non-ASCII content to trigger UTF-8 handling
- Validating usernames or IDs in ASCII-only contexts
- Combining with isprintable / isalnum for stricter checks
Reach for something else
- Case where empty must NOT count → guard with `s and`
- Excluding control characters → combine with isprintable
- ASCII letters only → combine with isalpha
- Rich internationalization support — ASCII-only is usually the wrong call in 2024+
Notes
Complexity
O(n) — one linear scan
Return
bool — True or False (True on empty)
CPython impl
Objects/unicodeobject.c :: unicode_isascii
Memory
No allocation
Thread-safe
Yes — strings are immutable
FAQ
isascii tests "every character has codepoint < 128". For the empty string, this is vacuously true — no character can violate the rule. The rest of the is* family also requires "at least one character", but isascii does not.
History
3.7
isascii() introduced — added to str, bytes, and bytearray at the same time.